16

次の機能が機能する理由を理解するのに苦労しています。

my $array_reference;
foreach $element (@{$array_reference}) {
# some code
}

以下は機能しませんが

my $array_reference;
if (scalar (@{$array_reference}) {
    # some code here
}

私は、perlが未定義の参照を生き生きとさせる(自動活性化する)ことを理解しています。しかし、後者のコードセグメントがFATALをスローする理由については、まだ混乱しています。

4

3 に答える 3

11

逆参照は、左辺値コンテキスト (変更可能な値が期待される場合) で自動有効化され、foreach は左辺値コンテキストを作成します。

>perl -E"$$x = 1;  say $x;"
SCALAR(0x74b024)

>perl -E"++$$x;  say $x;"
SCALAR(0x2eb024)

>perl -E"\$$x;  say $x;"
SCALAR(0x30b024)

>perl -E"sub {}->($$x);  say $x;"
SCALAR(0x27b03c)

>perl -E"for ($$x) {}  say $x;"
SCALAR(0x25b03c)

$_[0]最後の 2 つは、(それぞれ)および(それぞれ)エイリアスする値が必要なため、左辺値コンテキストを作成します$_

于 2011-06-21T04:33:24.430 に答える
7

Perl にはこの分野で矛盾がありますが、一般に、構造を変更する可能性のあるコードは自動有効化しますが、変更しないコードは無効にします。自動有効化されない場合は、未定義の値を逆参照しようとしているため、警告が発生するか、use strict "refs"例外が発生します。

于 2011-06-21T03:19:35.697 に答える
4

perlrefを見ると、これは予想される動作だと思います:

"適切なタイプの参照は、それらが存在すると想定されるコンテキストで参照解除すると、存在する可能性があります。 "

foreach と同様のことが push() とその仲間で発生します。

my $f;
push @$f, 1;
say @$f;

ただし、新しい参照バージョンではありません。

my $f = [];
push $f, 1;
say @$f;

働きながら

my $f;
push $f, 1;
say @$f;

そうではありませんが、プッシュはあなたが本当に何を意味しているのかわからないので、これは賢明だと思います。

興味深い質問は、scalar(@$undef) が同じことを行うべきか、または最終的に undef を返すように警告するべきかということです。

于 2011-06-21T03:21:04.463 に答える