2

コードは次のとおりです。

$ref = \(1,2);
print "$ref\n";
print "@$ref\n";

それは私に与えます:

SCALAR(0xa15a68)
Not an ARRAY reference at ./test.pl line 23.

結果の型が不明な関数を呼び出すラッパー関数を作成しようとしていました。
実際の関数を呼び出し、結果を保存し、他のことを行い、保存された結果を返す必要があります。しかし、スカラー値を期待する呼び出し元にとって、配列を返すことと括弧内のリストを返すことは別のものであることが判明しました。これが、参照を使用しようとした理由です。

4

2 に答える 2

7

あなたが欲しいのはこれです:

$ref = [ 1, 2 ];

あなたのコードで:

$ref = \(1,2);

右側が行うことは、配列への参照ではなく、参照のリストを作成することです。これと同じです:

$ref = ( \1, \2 );

そのリストをスカラーに割り当てているため、最後のアイテムを除くすべてが破棄 $refされ、スカラー値 2 への参照に設定されますが、これはおそらくあなたが望むものではありません。

を参照してくださいperldoc perlref

この動作は、サブルーチン呼び出しなどの非リテラル値でも一貫していることに注意してください。次のようにサブを呼び出す場合:

$val = function();

次に、functionサブルーチンはスカラー コンテキストで呼び出され、リスト コンテキストで呼び出された場合とは異なる値を返すことを選択できます。( を参照してくださいperldoc -f wantarray。) とにかくリストを返すことを選択した場合、リストの最後の要素以外はすべて破棄され、最後の要素が に割り当てられ$valます。

sub fun1() { return 1; }
sub fun2() { return (1,2); }
my $f1 = fun1();
my $f2 = fun2();
# $f1 is 1, and $f2 is 2

my $r1 = \( fun1() );
my $r2 = \( fun2() );
# $r1 is a ref to 1, and $r2 is a ref to 2
于 2013-05-03T19:18:18.927 に答える