2017-11-13 8 views
1

私はリストを返す関数をperlに持っています。 fooは()のコピーをリストに割り当てられているというのが私の理解がなされている。perlは、コピーを作成せずに関数から返された一時リストを参照しますか?

sub foo() { return `ping 127.0.0.1` } 

my @list = foo(); 

@listが、その後@oldlist = @list;のように別のリストに転送すると、別のコピーが作成される必要があること。だから私はmy $listref = \foo();のような返されたリストから参照を作成し、その参照を割り当てることはできますが、それは機能しません。

私が扱っている関数はかなり大きなリストを返すコマンドを実行します(pingコマンドは単なる例のためです)。私はできるだけコピーを最小限に抑えたいので、できるだけコピーしています。それに対処する良い方法は何ですか?

答えて

6

my $listref = [ foo() ]; 
を返された。しかし、あなたが開始するための配列リファレンスを返すことはできませんリストの無名配列リファレンスを作りますか?それも一般的には良いです。


あなたが試みたことは「リストの参照を取る」...文字通りの意味ではできないこと。変数、サブルーチン、または値にバックスラッシュ演算子を使用することにより、一方reference can be taken

リストは、"elusive" thingsあります。

と「リスト」のいずれかではありません(サブルーチンと私たちは構文\&sub_nameが必要)

しかし、であれば参照は、いずれかのリストの各要素に、を取られ\オペレータとリストコンテキスト

my @ref_of_LIST = \(1,2,3); #--> @ref_of_LIST: (\1, \2, \3) 

スカラーコンテキストの場合、これはあなたの試みで起こるものです。あなたのサブクラスは値のリストを返すので、comma operatorによって評価され、最後まで1つずつ破棄されます。偶然にも参照がそのスカラー

my $ref_of_LIST = \(1,2,3); #--> $ref_of_LIST: \3 

に撮影され、これはすべて\foo()と、同様に括弧なしで適用されます。

+1

リストを返すコマンドから配列refを返す方法がわかりません。 'return [\' ping 1.2.3.4 \ '];' – newguy

+0

@newguyはい、そうするのが良い方法でしょう。もう1つは、配列の変数(例えば '@ ary')にコマンドの戻り値を格納することです - もしそれがsubのどこかで必要なら' return \ @ary; ' – zdim

+0

ありがとう。 – newguy

関連する問題