Como han mencionado otros, Perl solo evaluará cadenas como las ha escrito utilizando eval
para invocar el compilador en tiempo de ejecución. Puede usar referencias como se señala en algunas otras respuestas, pero eso cambia la apariencia del código ($$a
vs $a
). Sin embargo, al ser Perl, hay una manera de ocultar la funcionalidad avanzada detrás de una variable simple, usando tie
.
{package Lazy;
sub TIESCALAR {bless \$_[1]} # store a reference to $b
sub FETCH {${$_[0]}} # dereference $b
sub STORE {${$_[0]} = $_[1]} # dereference $b and assign to it
sub new {tie $_[1] => $_[0], $_[2]} # syntactic sugar
}
my $b = 1;
Lazy->new(my $a => $b); # '=>' or ',' but not '='
print "$a\n"; # prints 1
$b = 2;
print "$a\n"; # prints 2
Usted puede buscar la documentación de tie
, pero en pocas palabras, que le permite definir su propia implementación de una variable (por escalares, arrays, hashes, o identificadores de archivo).Por lo tanto, este código crea la nueva variable $a
con una implementación que obtiene o establece el valor actual de $b
(almacenando una referencia a $b
internamente). El método new
no es estrictamente necesario (el constructor es realmente TIESCALAR
) pero se proporciona como azúcar sintáctico para evitar tener que usar tie
directamente en el código de llamada.
(que sería tie my $a, 'Lazy', $b;
)
Sugeriría no utilizar '$ a' y' $ b' para ejemplos como este, ya que estos son especiales de perl y * no * de alcance léxico (como lo demuestra su omisión del 'mi' delante de' $ b' en tu ejemplo). – pilcrow