Как уже упоминали другие, Perl будет оценивать строки только так, как вы их написали, используя eval
для вызова компилятора во время выполнения. Вы можете использовать ссылки, как указано в некоторых других ответах, но это меняет внешний вид кода ($$a
против $a
). Однако, поскольку это Perl, есть способ скрыть расширенные функциональные возможности за простой переменной, используя 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
Вы можете найти документацию для tie
, но в двух словах, она позволяет вам определить собственную реализацию переменной (для скаляров, массивов, хэшей или файловых дескрипторов). Таким образом, этот код создает новую переменную $a
с реализацией, которая получает или устанавливает текущее значение $b
(путем сохранения ссылки на $b
внутри). Метод new
не является строго необходимым (конструктор на самом деле TIESCALAR
), но предоставляется как синтаксический сахар, чтобы избежать необходимости использовать tie
непосредственно в вызывающем коде.
(что будет tie my $a, 'Lazy', $b;
)