がより良い方法を参考にPerl?
-
20-09-2019 - |
質問
んでいるのはパススルーによる参照のようになります:
use strict;
use warnings;
sub repl {
local *line = \$_[0]; our $line;
$line = "new value";
}
sub doRepl {
my ($replFunc) = @_;
my $foo = "old value";
$replFunc->($foo);
print $foo; # prints "new value";
}
doRepl(\&repl);
りクリーナーの仕事です。
試作品なので使用してい機能の参照信託んの良い理由を使用し機能参照)。
ものを使用しない $_[0]
至るところ repl
での醜い.
解決
あなたはデータ::エイリアスまで見たことがありますか?それはあなたがきれいな構文で字句スコープのエイリアスを作成することができます。
あなたは、このような参照渡しセマンティクスを作成するためにそれを使用することができます
use strict;
use warnings;
use Data::Alias;
sub foo {
alias my ($arg) = @_;
$arg++;
}
my $count = 0;
foo($count);
print "$count\n";
出力は、コールがその引数を変更し1
することを示す、foo
である。
他のヒント
sub repl {
my $line = \$_[0]; # or: my $line = \shift
$$line = "new value";
}
カップルの方もよろしくお願いします。明示的に渡すスカラー refを $foo
, になってPerlの通参照セマンティクス.
明示的な参考:
my $foo = "old value";
doRepl( \&repl, \$foo );
print $foo; # prints "new value";
sub repl {
my $line = shift;
$$line = "new value";
}
sub doRepl {
my ($replFunc, $foo) = @_;
$replFunc->($foo);
}
パスによる参考:
my $foo = "old value";
doRepl( \&repl, $foo );
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
$replFunc->(@_);
}
でもローカル色の強パスによる参考:
my $foo = "old value";
doRepl( \&repl, $foo );
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
&$replFunc;
}
最初の使用通常のperlのハードへの参照い。
最初の通refの手法を用い、このPerlパスを引数は全ての機能として参照です。の要素 @_
実際にエイリアスの値を引数リストの型が呼び出されます。を変化させることによって $_[0]
に foo()
, は、実際の最初の引数に指定 foo()
.
第二通りref方法の使用が副れること &
sigilなパーを取得します @_
配列の呼び出し側に返します。それ以外の場合は同じです。
更新: 私が欲しいな $_[0]
.することができreplしたい場合は:
sub repl {
for my $line( $_[0] ) {
$line = 'new value';
}
}
私はこのケースでエイリアスを作成するlocal
を使用してに何か問題があるとは思いません。
ダイナミックスコープはもちろん、強力な機能ですが、同じ名前の字句がスコープ内にある場合に限り、あなたは(新しい値は、その範囲から呼び出された関数に表示されている副作用を認識しているとして、それができません、ローカライズされ...)それはすでにあふれPerlのツールボックスに有用な付加されます。
local
についてはPerlのドキュメントでの警告のための主な理由ではなくmy
の不注意で、それを使用してから人々を保つためにとのPerl4からの移行を容易にするためです。 local
が有用であり、これが1のときしかし、時代は間違いなくあります。
あなたのエイリアスを作成するfor
を使用することもオプションですが、私はその意思で明確local
との明示的な構文を見つけます。それはパフォーマンスが懸念される場合も少し速くなります。