48

Perl には 2 つのデータ構造があります。

配列:

my @array2 = ( "1", "2", "3");

for $elem (@array2) {
    print $elem."\n";
}

次の出力が得られます。

1
2
3

そしてリスト:

my @array = [ "1", "2", "3"];                                            

for $elem (@array) {
    print $elem."\n";
}

次の出力が得られます。

ARRAY(0x9c90818)

明らかに、どちらの場合も要素を反復処理したいのですが、2 番目の解決策でこの配列への参照しか得られないのはなぜでしょうか?

4

6 に答える 6

87

Perlのリストはデータ構造ではなく、ソースコード内の位置であり、周囲のコンテキストによって決定されます。リストは基本的に、Perlがデータを移動するために使用する一時的な構造です。Perlのすべての構文を使用してそれらを操作しますが、データ型としてそれらを操作することはできません。リストに最も近いデータ型は配列です。

my @var    =    (1, 2, 3);  # parens needed for precedence, they do not create a list
   ^ an array    ^ a list

say 1, 2, 3;
    ^ a list

say @var;
    ^ a list (of one array, which will expand into 3 values before `say` is called)

あなたがしていることを書くとき[1, 2, 3]は、スカラー配列参照を作成することです。その配列参照はリスト1, 2, 3で初期化され、名前付き配列を作成してその配列への参照を取得するのと同じです。

[1, 2, 3]   ~~   do {my @x = (1, 2, 3); \@x}

コンストラクトはスカラーを作成するため[...]、スカラーで保持する必要があります。

my $array = [1, 2, 3];                                            

for my $elem (@$array) {   # lexical loop variable
    print $elem."\n";
}

参照だけでなく配列全体を操作したいので、格納されている配列参照を逆参照するの@前にを配置します。$array

于 2011-05-16T22:44:15.083 に答える
38

角かっこは、匿名配列を作成するために使用されます。評価されると、実際の配列値ではなく、この配列への参照が返されます。

括弧にはそのような隠されたプロパティはありませんが、数学の場合と同様に、式内の優先順位をオーバーライドするだけです。例えば:

my @array = 1,2,3;

実際には次のように評価されます:

my @array = 1;
2,3; # causes the warning "Useless use of constant in void context"

=演算子はコンマよりも優先順位が高いためです。したがって、これを回避するために、配列を割り当てるときに括弧を使用します。

my @array = (1,2,3);

あなたの例:

my @array = [1,2,3];

これを言うようなものです:

my @tmp = (1,2,3);
my @array = \@tmp;

は、配列\への参照を作成するために使用されます。@tmp

于 2011-05-16T22:52:17.400 に答える
8

角かっこは匿名配列を作成し、角かっこの内容を配列に入力して、その配列への参照を返します。言い換えると、

[ "1", "2", "3" ]

基本的には

do { my @anon = ("1", "2", "3"); \@anon }

したがって、コードは次のようになります。

my $array_ref = [ "1", "2", "3" ];

for (@$array_ref) {  # Short for @{ $array_ref }
    print "$_\n";
}

また

my @array_of_refs = ([ "1", "2", "3" ]);

for my $array_ref (@array_of_refs) {
    for (@$array_ref) {
        print "$_\n";
    }
}
于 2011-05-16T23:24:39.333 に答える
5

さらに明確にしたい場合は、関連するドキュメントを参照してください。

説明のためにいくつかのことを試すことができます。

#!perl -lw # -l appends a \n to each print, -w enables warnings
use strict;
my $aryref = [1 .. 5];
print for $aryref;    # Prints the stringified reference - not what you want
print for @$aryref;   # Dereferencing it lets you access the array
my @ary = $aryref;    # Probably not what you want
print for @ary;       # Stringified reference again
print for @{$ary[0]}; # Dereference the first array element (which holds the ref)
于 2011-05-16T22:20:48.017 に答える
0

Perlでは、配列とリストは基本的に同じものですが、2番目の例ではどちらも使用していません。角かっこは配列参照(スカラー値)を囲み、のようなもので配列にスカラーを「割り当てる」ことmy @array = $scalarはと同等my @array = ($scalar)です。したがって、@array2番目の例のの唯一の要素は配列参照です。

于 2011-05-16T21:49:40.767 に答える