これを行うにはいくつかの方法があります。スカラー参照を明示的に渡す$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メソッドによる2番目のパスは、 sigilで呼び出され、parensがないsub@_
がその呼び出し元の配列を取得するという事実を使用します。それ以外は同じです。
更新:あなたが避けたいと思っていることに気づきました$_[0]
。必要に応じて、replでこれを行うことができます。
sub repl {
for my $line( $_[0] ) {
$line = 'new value';
}
}