0

そのため、多次元配列を試していて、さまざまな方法でそれらにアクセスできることに気付きましたが、同じタスクを実行できます (以下のコードを参照)。strict/warnings を使用する場合、Perl は、コメントで ** で示されているフォームを使用しないように指示しました。

use strict;
use warnings;

my @a=();

push @a, [([1,1,1])];
push @a, [([2,2,2],[2,2,2])];
push @a, [([3,3,3],[3,3,3],[3,3,3])];
push @a, [([4],[4,4,4],[4,4,4],[4,4,4],[4,4,4],[4,4,4])];

print scalar(@a)."\n"; #Prints Size of outer array == 4

print scalar(@{@a[3]})."\n"; #Prints number of arrays in slot 3 of @a == 6 **
#or alternatively
print scalar(@{$a[3]})."\n"; #Prints number of arrays in slot 3 of @a == 6 

print scalar(@{@{@a[3]}[0]})."\n"; #Prints size of array in @a of (3,0) == 1  **
#or alternatively
print scalar(@{$a[3][0]}); #Prints size of array in @a of (3,0) == 1 

上記の 2 つの例には実際に機能的な違いがありますか? **が付いている行が他の行よりも悪いのはなぜですか? 単純に、相手よりも混乱しているということでしょうか?

前もって感謝します。

4

2 に答える 2

2
$a[...]   # array element

インデックス式で識別される 1 つの要素を返し、

@a[...]   # array slice

要素の数によって識別されるすべての要素を返します。

そのような、

  • $a[EXPR]この情報を読者に伝えるために、単一の要素にアクセスする場合に使用する必要があります。実際、そうしないと警告が表示されます。
  • @a[LIST]多くの要素または可変数の要素にアクセスする場合に使用する必要があります。

この 2 つには別の違いがありますが、それは微妙です。配列要素のインデックス式はスカラー コンテキストで評価されますが、配列スライスのインデックス式はリスト コンテキストで評価されます。

sub f { return @_; }

$a[ f(4,5,6) ]     # Same as $a[3]
@a[ f(4,5,6) ]     # Same as $a[4],$a[5],$a[6]
于 2013-04-28T04:59:56.680 に答える
1

この特定の問題は、参照または逆参照とは関係ありません。構文 $a[n] を使用して、配列 @a の n 番目の要素を取得します。これは英語にインスパイアされたものです ("thes" 要素の "this" 要素)。

@a[] は、配列スライスを取得するために使用されます。たとえば、@a[0,1,2];

于 2013-04-28T04:37:50.990 に答える