有幾種方法可以做到這一點。顯式傳遞一個標量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將參數作爲引用傳遞給所有函數的事實。當調用子例程時,@_
的元素實際上是參數列表中值的別名。通過改變foo()
中的$_[0]
,您實際上將第一個參數更改爲foo()
。
第二次通過ref方法使用的事實是,調用&
sigil並且沒有parens調用的子實例獲取調用者的@_
數組。否則它是相同的。
更新:我只是注意到你想避免$_[0]
。如果你願意,你可以在repl中這樣做:
sub repl {
for my $line($_[0]) {
$line = 'new value';
}
}
不幸的是,我看着文檔的「實施」部分... ack!我猜這個模塊有點像香腸......如果你不知道它們是如何製作的,那麼它會更令人愉快...... :) – JoelFan 2010-03-18 16:22:31
@JoelFan:yup。這是一個「不要在家裏嘗試這個」模塊:) – 2010-03-18 16:37:12
開始「這個模塊不使用源過濾器」,並從那裏下坡... :) – JoelFan 2010-03-18 20:01:30