サーチ…


リストとしての配列

配列は、Perlの基本変数型の1つです。これには、0個以上のスカラーの順序付けられたシーケンスであるリストが含まれています。配列は、 perldataに記載されているように、リストデータを保持する(およびアクセスを提供する)変数です

アレイにリストを割り当てることができます:

my @foo = ( 4, 5, 6 );

リストが期待される場所であればどこでも配列を使うことができます:

join '-', ( 4, 5, 6 );
join '-', @foo;

一部の演算子は、配列に含まれるリストを変更するため、配列のみを処理します。

shift @array;
unshift @array, ( 1, 2, 3 );
pop @array;
push @array, ( 7, 8, 9 );

リストをハッシュに割り当てる

リストをハッシュ変数に割り当てることもできます。ハッシュ変数に代入されるリストを作成するときは、キーと値の間に太いカンマ =>を使用して関係を表示することをお勧めします。

my %hash = ( foo => 42, bar => 43, baz => 44 );

=>は実際にはオペランドを自動的に左に引用する特殊なカンマです。したがって、通常のコンマを使用できますが、関係は明確ではありません。

my %hash = ( 'foo', 42, 'bar', 43, 'baz', 44 );

fatカンマ=>の左辺オペランドにも引用符で囲まれた文字列を使用することができます。これはスペースを含むキーに特に便利です。

my %hash = ( 'foo bar' => 42, 'baz qux' => 43 );

詳細は、 perldoc perlop コンマ演算子を参照してください。

リストはサブルーチンに渡すことができます

リストをサブルーチンに渡すときは、サブルーチンの名前を指定して、そのサブルーチンにリストを渡します。

test_subroutine( 'item1', 'item2' );
test_subroutine  'item1', 'item2';     # same

内部的にはPerlはこれらの引数にエイリアスを作成し、配列に入れて@_サブルーチン内で提供されています:

@_ =  ( 'item1', 'item2' ); # Done internally by perl

あなたは次のようにサブルーチン引数にアクセスします:

sub test_subroutine {
    print $_[0]; # item1
    print $_[1]; # item2
}

エイリアスを使用すると、サブルーチンに渡された引数の元の値を変更することができます。

sub test_subroutine {
    $_[0] +=  2;
}

my $x =  7;
test_subroutine( $x );
print $x; # 9

サブルーチンに渡された元の値の不注意な変更を防ぐために、それらをコピーする必要があります:

sub test_subroutine {
    my( $copy_arg1, $copy_arg2 ) =  @_;
    $copy_arg1 += 2;
}

my $x =  7;
test_subroutine $x; # in this case $copy_arg2 will have `undef` value
print $x; # 7

サブルーチンに渡された引数の数を調べるには、 @_

sub test_subroutine {
    print scalar @_, ' argument(s) passed into subroutine';
}

配列引数をサブルーチンに渡すと、それらはすべてフラットになります:

my @x =  ( 1, 2, 3 );
my @y =  qw/ a b c /; # ( 'a', 'b', 'c' )
test_some_subroutine @x, 'hi', @y; # 7 argument(s) passed into subroutine
# @_ =  ( 1, 2, 3, 'hi', 'a', 'b', 'c' ) # Done internally for this call

test_some_subroutine$_[4] = 'd'という文が含まれている場合、上記の呼び出しの場合、 $y[0]値は後でdなります。

print "@y"; # d b c

サブルーチンからリストを返す

もちろん、サブシステムからリストを返すこともできます:

sub foo {
    my @list1 =  ( 1, 2, 3 );
    my @list2 =  ( 4, 5 );

    return    ( @list1, @list2 );
}

my @list =  foo();
print @list;          # 12345

しかし、あなたが何をしているのか分からない限り、それを行うのはお勧めの方法ではありません

結果がLISTコンテキストにあるときはこれは問題ありませんが、 SCALARコンテキストでは不明です。次の行を見てみましょう:

print scalar foo();  # 2

なぜ2 ?何が起こっている?

  1. foo()SCALARコンテキストで評価されるため、このリスト( @list1, @list2 )SCALARコンテキストで評価されます
  2. SCALARコンテキストでは、LISTは最後の要素を返します。ここは@list2
  3. SCALAR文脈では、 配列 @list2はその要素の数を返します。ここは2です。

ほとんどの場合、 正しい戦略はデータ構造への参照を返します
したがって、私たちの場合、代わりに以下を実行する必要があります:

 return    ( \@list1, \@list2 );

次に、呼び出し元は、返された2つの配列のリファレンスを受け取るために、このような処理を行います。

 my ($list1, $list2) = foo(...);

arrayrefを使用して配列をサブ配列に渡す

@fooの@foo\@fooです。これは配列やその他のものをサブルーチンに渡す必要がある場合に便利です。 @foo渡す@fooは、複数のスカラーを渡すようなものです。しかし、 \@fooは単一のスカラーです。サブルーチンの内部:

xyz(\@foo, 123);
...
sub xyz {
    my ($arr, $etc) = @_;
    print $arr->[0]; # using the first item in $arr. It is like $foo[0]

リストとしてハッシュ

リストコンテキストでハッシュは平坦化されます。

my @bar =  ( %hash, %hash );

配列 @barは、2 %hashハッシュのリストによって初期化されます

  • 両方の%hashが平坦化されます
  • フラット化されたアイテムから新しいリストが作成されます
  • @bar配列はそのリストによって初期化されます

キーと値のペアが一緒になっていることが保証されています。キーは常にインデックスされ、値は奇数です。キーと値のペアが常に同じ順序でフラット化されることは保証されていません。

my %hash =  ( a => 1, b => 2 );
print %hash; # Maybe 'a1b2' or 'b2a1'


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow