Go to the first, previous, next, last section, table of contents.


配列関数とリスト関数

Function: delete expr
ハッシュ配列から指定された value を削除します。削除された値か、(何も削除 されなかった場合には) 未定義値が返されます。$ENV{} から削除を行な うと、実際に環境変数を変更します。DBM ファイルに tie された配列か らの削除は、その DBM ファイルからエントリを削除します。(しかし、 tie されたハッシュからの削除が、値を返すとは限りません。)

以下は、連想配列のすべての value を削除します:

foreach $key (keys %ARRAY) {
    delete $ARRAY{$key};
}

(ただし、undef() コマンドを使った方が速いでしょう。)最終的な操作 がハッシュの key による検索である限りは、$var{expr} には任意の複雑な式を 置くことができます:

delete $ref->[$x][$y]{$key};

Function: each assoc_array
連想配列の次の value に対する、key と value からなる 2 要素の配列を返し ますので、連想配列上での繰り返しを行なうことができます。エントリは見かけ 上、ランダムな順序で返されます。配列をすべて読み込んでしまうと、空配列が 返されます (これは代入されると、偽 (0) となります)。そのあと、もう一度 each() を呼び出すと、再び繰り返しを始めます。反復子は、配列の要素 をすべて読むことによってのみリセットすることができます。繰り返しを行なっ ている間に、配列に要素を追加してはなりません。連想配列ごとに反復子が 1 つあり、プログラム中のすべての each() 関数、keys() 関数、 values() 関数で共用されます。以下のプログラムは、順番が異なるもの の、printenv(1) プログラムのように環境変数を表示します:
while (($key,$value) = each %ENV) {
    print "$key=$value\n";
}

keys()values() も参照してください。

Function: exists expr
指定されたハッシュ key が、ハッシュ配列に存在すれば、たとえ対応する value が未定義でも「真」を返します。
print "Exists\n" if exists $array{$key};
print "Defined\n" if defined $array{$key};
print "True\n" if $array{$key};

ハッシュ要素は、定義されているときにのみ真となり、存在しているときにのみ 定義されますが、逆は必ずしも真ではありません。

最終的な操作がハッシュの key による検索である限りは、$var{expr} には任意 の複雑な式を置くことができます:

if (exists $ref->[$x][$y]{$key}) { ... }

Function: grep block list
Function: grep expr,list
list の個々の要素に対して、blockexpr を評価し($_ は、ローカルに個々の要素が設定されます) 、その要素のうち、評価した式が真 となったものからなるリスト値が返されます。スカラコンテキストでは、式が真 となった回数を返します。例:
@foo = grep(!/^#/, @bar);    # コメント行の除去

@foo = grep {!/^#/} @bar;    # コメント行の除去

は、同じことをします。

$_ は、list の値へのリファレンスですので、配列の要素を変更するため に使うことができます。これは、便利でサポートされていますが、list が名前の付いた配列でないと、悲惨な結果になります。

Function: join expr,list
list の個別の文字列を、expr の値で区切って1 つの文字列につな げ、その文字列を返します。例:
$_ = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);

このSee section 組み込み関数,の split の項も参照してください。

Function: keys assoc_array
指定した連想配列のすべての key からなる、通常配列を返します。(スカラコン テキストでは、key の数を返します。)返される key の順序は、見た目にばらば らなものですが (連想配列に変更がなければ)、values() 関数や each() 関数で返されるものと同じ順序です。環境変数を表示する別の例 です:
@keys = keys %ENV;
@values = values %ENV;
while ($#keys >= 0) {
    print pop(@keys), '=', pop(@values), "\n";
}

key をソートしてもいいでしょう:

foreach $key (sort(keys %ENV)) {
    print $key, '=', $ENV{$key}, "\n";
}

Function: map block list
Function: map expr,list
list の個々の要素に対して、blockexpr を評価し($_ は、ローカルに個々の要素が設定されます) 、それぞれの評価結果からなるリス ト値が返されます。blockexpr をリストコンテキストで評価し ますので、list の個々の要素によって作られる、返却値であるリストの 要素数は、0 個の場合もあれば、複数の場合もあります。
@chars = map(chr, @nums);

は、数のリストを対応する文字に変換します。また、

%hash = map {&key($_), $_} @array;

は、

%hash = ();
foreach $_ (@array) {
    $hash{&key($_)} = $_;
}

をちょっと変わった書き方で書いたものです。

Function: pop array
配列の最後の値をポップして返し、配列の大きさを 1 だけ小さくします。これ は、
$tmp = $ARRAY[$#ARRAY--];

と同じ効果があります。指定された配列に要素がなければ、未定義値が返されま す。

Function: push array,list
array をスタックとして扱い、list 内の値を array の終わ りにプッシュします。array の大きさは、list の長さ分だけ大き くなります。これは、
for $value (LIST) {
    $ARRAY[++$#ARRAY] = $value;
}

とするのと同じ効果がありますが、より効率的です。変更後の配列の要素数を返 します。

Function: reverse list
リストコンテキストでは、list を構成するよ要素を逆順に並べた、リス ト値を返します。スカラコンテキストでは、list の最初の要素のバイト 順序を逆順にした文字列を返します。(訳注: 4.036 では、スカラコンテキスト で最初の要素ではなく、最後の要素の逆順にします。5.0000 では、スカラコン テキストでリストをつなげた文字列を反転しているようです。)

Function: scalar expr
expr を強制的にスカラコンテキストで解釈されるようにして、 expr の値を返します。

Function: shift array
Function: shift
配列の最初の値を取り出して、その値を返し、配列を一つ短くして、すべての要 素を前へずらします。配列に要素がなければ、未定義値を返します。 array を省略すると、メインプログラムでは、@ARGV 配列を shift し、サブルーティンでは、@_ 配列を shift します。(こ れは、文面上で決まります。) unshift()push()pop() も参照してください。shift()unshift() は、 push()pop() が配列の右端で行なうことを、左端で行ないま す。

Function: sort subname list
Function: sort block list
Function: sort list
list をソートし、ソートされたリスト値を返します。配列内の存在しな い値は、なくなります。subnameblock を省略すると、標準の文 字列比較の順番でソートが行なわれます。subname を指定すると、それは、 配列の要素をどのような順番に並べるかに応じて、負、ゼロ、正の整数を返すサ ブルーティンの名前であると解釈されます。(このようなルーティンには、 <=> 演算子や cmp 演算子が、たいへん便利です。) subname は、スカラ変数でもよく、その場合には、その値が使用するサブ ルーティンの名前と解釈されます。subname の代わりに、無名のインライ ンソートルーティンとして、block を書くことができます。

効率化のために、このサブルーティンでは、通常の呼び出し処理は行なわれず、 以下のような制約があります。このサブルーティンは、再帰サブルーティンであっ てはなりません。比較のためサブルーティンに渡される 2 つの要素は、@_ で はなく、$a と $b で渡されます (次の例を参照してください)。これらはリファ レンスによって渡されるので、$a や $b を変更しないでください。

例:

# 文字の順でソート
@articles = sort @files;

# 同じことを明示的にソートルーティンを指定して
@articles = sort {$a cmp $b} @files;

# 同じことを逆順に
@articles = sort {$b cmp $a} @files;

# 数値の昇順にソート
@articles = sort {$a <=> $b} @files;

# 数値の降順にソート
@articles = sort {$b <=> $a} @files;

# サブルーティン名を指定してソート
sub byage {
    $age{$a} <=> $age{$b};  # 整数を仮定
}
@sortedclass = sort byage @class;

sub backwards { $b cmp $a; }
@harry = ('dog','cat','x','Cain','Abel');
@george = ('gone','chased','yz','Punished','Axed');
print sort @harry;
        # AbelCaincatdogx と出力
print sort backwards @harry;
        # xdogcatCainAbel と出力
print sort @george, 'to', @harry;
        # AbelAxedCainPunishedcatchaseddoggonetoxyz と出力

Function: splice array,offset,length,list
Function: splice array,offset,length
Function: splice array,offset
array から offsetlength で指定される要素を取り除き、 list があれば、それを代わりに挿入します。配列から取り除かれた要素 を返します。配列は、必要に応じて、大きくなったり、小さくなったりします。 length が省略されると、offset 以降のすべての要素を取り除きま す。以下は、($[ == 0 と仮定すると) それぞれ、等価です。
push(@a,$x,$y)      splice(@a,$#a+1,0,$x,$y)
pop(@a)             splice(@a,-1)
shift(@a)           splice(@a,0,1)
unshift(@a,$x,$y)   splice(@a,0,0,$x,$y)
$a[$x] = $y         splice(@a,$x,1,$y);

次の例では、配列の前に、それぞれの配列の大きさが渡されるものとしています:

sub aeq {   # 2 つのリスト値を比較する
    local(@a) = splice(@_,0,shift);
    local(@b) = splice(@_,0,shift);
    return 0 unless @a == @b;    # 長さは等しいか
    while (@a) {
        return 0 if pop(@a) ne pop(@b);
    }
    return 1;
}
if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... }

Function: split /PATTERN/,EXPR,LIMIT
Function: split /PATTERN/,EXPR
Function: split /PATTERN/
Function: split
文字列を文字列の配列に分割して、それを返します。

リストコンテキストでない場合には、見つかったフィールドの数を返し、配列 @_ に分割結果を設定します。(リストコンテキストでは、パターンの区切り文 字に ?? を使うことで、強制的に @_ に分割結果を残すことができますが、返 却値は配列値のままです。)しかし、暗黙の @_への split は使わない ようにしてください。

expr を省略すると、文字列 $_ を split します。もし、 pattern も省略すると、空白 (/[ \t\n]+/) で split します。 pattern にマッチするものは、フィールドを分割するデリミタとして扱わ れます。(デリミタは、1 文字とは限りません。)負でない limit を指定 した場合には、最大その数までのフィールドに split します (しかし、 それより少ないことはあります)。limit を指定しないと、末尾の空フィー ルドを捨ててしまいます (pop() を行なうときには気を付けないといけ ません)。limit が負ならば、limit に任意の大きな数を指定した のと同じことになります。

空文字列にマッチするパターン (ヌルパターン // と混同しないでください。こ れは、空文字列にマッチするパターンの一つでしかありません) は、どの場所に もマッチし、expr の値を1 文字ずつに分割します。たとえば、

print join(':', split(/ */, 'hi there'));

は、'h:i:t:h:e:r:e' という出力になります。

limit を使うと、行を部分的に split することができます。

($login, $passwd, $remainder) = split(/:/, $_, 3);

リストへ代入するとき、limit を省略すると、Perl は、無駄な仕事を避 けるため、そのリストの変数の数より、1つだけ大きい limit が与えられ たものとして処理を行ないます。上のリストの場合には、limit はデフォ ルトで 4 になります。時間が問題となるアプリケーションでは、必要以上のフィー ルドに分けないようにする必要があります。

pattern に括弧が含まれていると、デリミタ内の部分文字列にマッチする ものも、配列要素に含まれるようになります。

split(/([,-])/, "1-10,20");

は、リスト値

(1, '-', 10, ',', 20)

を生成します。

`/PATTERN/' は、実行時に変わるパターンを指定する式で置き換えること ができます。(実行時のコンパイルを 1 度にするために、`/$variable/o' を使ってください。) 特別な場合として、スペース (' ') を指定すると、引数 なしの split のように空白で split を行ないますが、先頭の空 白で、最初に空のフィールドができません。つまり、split(' ') は、 awk のデフォルトの動作をエミュレートするために使うことができ、 split(/ /) は行頭のスペースの数に応じた空フィールドができます。

例:

open(passwd, '/etc/passwd');
while (<passwd>) {
    ($login, $passwd, $uid, $gid,
             $gcos, $home, $shell) = split(/:/);
    ...
}

(上記の $shell には、まだ改行がついたままです。このドキュメントの chopchompjoin の項を参照してください。)

Function: unshift array,list
shift の逆操作を行ないます。見方を変えれば、push の逆操作 とも考えられます。listarray の先頭に入れて、新しくできた 配列の要素の数を返します。
unshift(ARGV, '-e') unless $ARGV[0] =~ /^-/;

list は、はらばらにではなく、一度に登録されるので、順番はそのまま です。逆順に登録するには、reverse を使ってください。

Function: values assoc_array
指定した連想配列のすべての value からなる通常配列を返します。(スカラコン テキストでは、value の数を返します。) 返される value の順序は、見た目に ばらばらなものですが、同じ配列に対して、keys() 関数や each() 関数が返すものと同じ順序です。keys()each() も参照してください。


Go to the first, previous, next, last section, table of contents.

検索式: