6

私が従った基本的な構文チュートリアルでは、これが明確になりません。

前者または後者の添字表記を使用して配列にアクセスすることの間に、実用的/哲学的/コンテキスト依存/トリッキーな違いはありますか?

$ perl -le 'my @a = qw(io tu egli); print $a[1], @a[1]'

出力はどちらの場合も同じようです。

4

3 に答える 3

9
$a[...]   # array element

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

@a[...]   # array slice

インデックス式で識別されるすべての要素を返します。

そのような、

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

しかし、これで話は終わりではありません。あなたは実用的でトリッキーな (微妙な?) 違いを求めましたが、まだ誰も言及していません: 配列要素のインデックス式はスカラー コンテキストで評価されますが、配列スライスのインデックス式はリスト コンテキストで評価されます。

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-03-31T04:07:53.253 に答える
8

警告をオンにすると(常にオンにする必要があります)、次のように表示されます。

スカラー値 @a[0] は $a[0] と記述したほうがよい

ご利用の際は@a[1]

@シジルは「何かのリストをくれ」という意味です。配列添え字とともに使用すると、配列のスライスを取得します。たとえば@foo[0..3]、配列の最初の 4 つの項目を取得します@foo

を書くときは@a[1]、 から 1 要素のスライスを求めています@a。それはまったく問題ありませんが$a[1]、代わりに , という単一の値を要求する方がはるかに明確です。最初の方法で行うと、Perl が警告するほどです。

于 2013-03-31T03:39:19.850 に答える
4

1 つ目はスカラー変数を生成し、2 つ目は配列スライスを生成します .... 非常に異なる動物 !!

于 2013-03-31T03:35:57.433 に答える