配列への参照として引数を返す関数を書くにはどうすればよいですか? \@foo
構築物はコンテンツ後で変更される可能性があり@foo
配列への参照を作成しながら関数が引数リストを配列参照として返す方法
0
A
答えて
12
sub f {
return [@_];
}
$ref = f(2, 3, 5);
print "@$ref\n";
[@foo]
構築物は、新たな匿名アレイ(@foo
のコピー)への参照を作成します。
2
配列としてその引数を返すサブルーチンを作成するには、いくつかの方法があります。これらの例が示すように
my ($x, $y) = (3, 4);
my $array = array $x, $y;
my $capture = capture $x, $y;
say "@$array, @$capture"; # prints '3 4, 3 4'
$x++;
say "@$array, @$capture"; # prints '3 4, 4 4'
$$capture[1] *= 2;
say "@$array, @$capture"; # prints '3 4, 4 8'
say "$x $y"; # prints '4 8'
、:
sub array {[@_]} # returns an array reference that is a copy of its argument
sub array_verbose { # the same as array(), but spelled out
my @copy = @_;
return \@copy;
}
sub capture {\@_} # returns a reference to the actual argument array
はarray
とcapture
の間にいくつかの重要な違いがあります。 array()
によって生成された配列は値によってコピーされ、それらの値は元の引数から独立しています。 capture()
によって生成された配列は、その引数リストへの双方向エイリアスを保持します。
速度にも違いがあります。 capture()
は、array()
よりも約40%高速です。なぜなら、配列の要素をコピーする必要がないからです(あるいは、それについても見てください)。もちろん、この速度の差は引数リストの長さによって変わります。
も、その要素に触れないcapture()
の追加の効果は、通常のメモリを割り当てることになる引数が使用されている場合は、引数をタッチするまで、その割り当てが起こらないということです。私自身のコードで
my %hash;
my $hashcap = capture $hash{a}, $hash{b}, $hash{c};
say join ', ' => keys %hash; # prints nothing
$_++ for @$hashcap;
say join ', ' => keys %hash; # prints 'c, a, b'
、私は通常capture()
をcap()
と綴るか、インラインで書く:
my $y = sub{\@_}->(map $_**2, 1..10);
関連する問題
- 1. 関数の引数で配列を参照する方法
- 2. 配列と参照引数でvoid関数を呼び出す方法
- 3. 関数を参照して配列を渡す方法は?
- 4. 関数とmemcpyへの参照としてchar配列を渡す方法
- 5. 配列を引数としてオブジェクトリストを照会する方法
- 6. 参照を引数として渡す関数への参照を渡す方法
- 7. javacriptの関数引数としてオブジェクト参照を渡す
- 8. 関数のパラメータで配列を参照する方法は?
- 9. 関数の引数としての参照?
- 10. 配列を返すPHP関数:なぜ参照渡しが必要ですか?
- 11. Knockoutjs - 多数参照リストを多数参照するネストされたグループ配列
- 12. 関数から配列を書き換えます。引数参照の使用
- 13. 配列を渡して参照を返す配列を返す
- 14. スカラマクロ:関数参照の引数型
- 15. フラグメントの引数として配列リストを渡して取得する方法
- 16. 引数としての自己参照
- 17. 関数が配列を返すことをアサートする方法
- 18. 複数の配列とリストを返す再帰関数
- 19. ロボットフレームワークのキーワードを参照して引数を渡す方法は?
- 20. 関数から変数文字列を返す方法とサブ文字列を参照する
- 21. constリスト参照引数を変換し、別の関数に渡すうまい方法ですか?
- 22. PHP:次の関数を仮定すると、参照配列名
- 23. Python、2つの配列と一緒に引数として関数をとる関数を作る方法は?
- 24. C++の関数パラメータとして参照渡し配列を渡す
- 25. ローカルオブジェクトへの参照を返す関数
- 26. 自動参照を返すD関数
- 27. ポインタを配列として使用して参照を返す
- 28. Python + SWIGで参照引数とポインタ引数を受け取る方法は?
- 29. 参照を返す関数、失敗した場合に返す関数
- 30. Powershell:PowershellからC#関数への配列の参照を渡す方法