有几种方法可以做到这一点。将标量 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]
in foo()
,您实际上将第一个参数更改为foo()
。
第二次通过 ref 方法使用这样一个事实,即使用&
sigil 而没有 parens 调用的 sub 获取@_
其调用者的数组。否则它是相同的。
更新:我刚刚注意到您希望避免$_[0]
. 如果需要,您可以在 repl 中执行此操作:
sub repl {
for my $line( $_[0] ) {
$line = 'new value';
}
}