Параметр командной строки -MO=Deparse
показывает, как Perl интерпретировал ваш код после его упрощения (например, преобразование heredocs в блоки qq{}). например
$ perl -MO=Deparse test.pl
$i = 1;
while ($i < 3) {
print qq[ def px$i = new E(user) \n if (!px$i.hasErrors()) {\n println "${$i->px . 'name';} / ${$i->px . 'empr' . 'to';} OK"\n }\n\n];
++$i;
}
Соответствующая часть:
println "${$i->px . 'name';} / ${$i->px . 'empr' . 'to';}
Perl преобразовал ${px$i.name}
в ${$i->px . 'name'}
!
В perl ${...}
означает оценивать все, что находится внутри блока, и рассматривать его как символическая ссылка (т. е. имя переменной) или скалярная ссылка, затем разыменуйте ее, чтобы снова превратить в скаляр. Поэтому Perl пытается выполнить все, что находится внутри этих блоков, рассматривая их содержимое как код Perl. Это потому, что ваш heredoc, "EOT"
, похож на строку в двойных кавычках и интерполирует знаки доллара.
Решение: избегайте знаков доллара ($
-> \$
) или используйте одинарные кавычки и конкатенацию, а не heredocs.
person
rjh
schedule
24.02.2010