0

なぜ次のことが起こるのかを誰かが説明するのはとても楽しいでしょうか?コードは次のとおりです。

#!/usr/bin/perl
use v5.14;
use warnings;

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

sub func
{
    return @arr;
}

push(&func(), 4);

say @arr;

実行しようとすると、出力はNot an ARRAY reference at ...です。

これは、を&func()評価するの@arrではなく、単純なリストを1, 2, 3評価し、の引数1として扱われるためだと思います。誰かがなぜこれが起こるのか説明できますか、ドキュメントでこれに関連するものは何も見つかりませんでした。ARRAYpushpush

前もって感謝します。

4

1 に答える 1

4

subが配列を返すことは不可能です。リストコンテキストで配列を評価した結果を返します。つまり、そのコンテンツのリストを返します。明らかに、それはあなたが望むものではありません。

push配列への参照を受け入れるようになるので、次を使用できます

sub func {
   return \@arr;
}

push(func(), 4);

最近まで配列リテラルがpush必要だったため、下位互換性が必要な場合は次を使用する必要があります。

sub func {
   return \@arr;
}

push(@{ func() }, 4);

PS —を削除したことに注意してください&。プロトタイプのないサブのプロトタイプを無視するようにPerlに指示するのはなぜですか?

于 2012-09-17T18:27:01.840 に答える