Hay un par de formas de hacerlo. Pase explícitamente una referencia escalar a $foo
, o aproveche el paso incorporado de Perl por semántica de referencia.
referencia explícita:
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);
}
Pasar por referencia:
my $foo = "old value";
doRepl(\&repl, $foo);
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
$replFunc->(@_);
}
Incluso pase más elegante por referencia: referencias duras
my $foo = "old value";
doRepl(\&repl, $foo);
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
&$replFunc;
}
El primero de ellos el uso de Perl normal a hacer el trabajo .
El primer método de pase por ref usa el hecho de que Perl pasa los argumentos a todas las funciones como referencias. Los elementos de @_
son en realidad alias de los valores en la lista de argumentos cuando se llama a la subrutina. Al alterar $_[0]
en foo()
, en realidad altera el primer argumento a foo()
.
El segundo método de pase por ref utiliza el hecho de que un sub llamado con un sigil &
y sin parens obtiene el arreglo @_
de su llamador. De lo contrario, es idéntico.
Actualización: Acabo de notar que desea evitar $_[0]
. Puede hacer esto en repl si lo desea:
sub repl {
for my $line($_[0]) {
$line = 'new value';
}
}
Desafortunadamente, miré la sección "Implementación" de los documentos ... ¡ack! Supongo que este módulo es como salchichas ... mucho más divertido si no sabes cómo se hacen ... :) – JoelFan
@JoelFan: yup. Este es en gran medida un módulo "No intente esto en casa" :) –
comienza "Este módulo no usa un filtro de fuente" y simplemente va cuesta abajo a partir de ahí ... :) – JoelFan