Es gibt mehrere Möglichkeiten, dies zu tun. Übergeben Sie explizit einen Skalarref an $foo
, oder nutzen Sie Perls integrierte Semantik für die Weitergabe durch Verweis.
Ausdrücklich:
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);
}
Pass von Referenz:
my $foo = "old value";
doRepl(\&repl, $foo);
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
$replFunc->(@_);
}
Auch ausgefallenere Pass von Referenz:
my $foo = "old value";
doRepl(\&repl, $foo);
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
&$replFunc;
}
Der erste Einsatz normale Perl harte Referenzen den Job zu erledigen .
Die ref-Methode zum ersten Durchlauf verwendet die Tatsache, dass Perl Argumente an alle Funktionen als Referenzen übergibt. Die Elemente von @_
sind tatsächlich Aliase zu den Werten in der Argumentliste, wenn das Unterprogramm aufgerufen wird. Indem Sie $_[0]
in foo()
ändern, ändern Sie tatsächlich das erste Argument zu foo()
.
Der zweite Durchlauf von Ref-Methode verwenden die Tatsache, dass ein Sub mit einem &
Sigil und keine Parens ruft die @_
Array seines Aufrufers. Ansonsten ist es identisch.
Update: Ich bemerkte gerade, dass Sie wünschen, $_[0]
zu vermeiden. Sie können dies in repl tun, wenn Sie wollen:
sub repl {
for my $line($_[0]) {
$line = 'new value';
}
}
Leider schaute ich auf die "Implementierung" -Abschnitt der Dokumentation ... ack! Ich nehme an, dieses Modul ist irgendwie wie Würstchen ... viel mehr Spaß, wenn Sie nicht wissen, wie sie gemacht sind ... :) – JoelFan
@JoelFan: yup. Dies ist sehr viel ein "Versuchen Sie es nicht zu Hause" -Modul :) –
beginnt "Dieses Modul verwendet keinen Quellfilter" und geht einfach von da ab ... :) – JoelFan