Если вы наберете $tmp
, он просто вернет строку внутри него, что означает, что вы сделаете: $var = 'x $i y'
. Вам нужно проверить строку в $tmp
, но не $var
. Кроме того, вы не можете напрямую оценить строку, вам нужно заключить ее в двойные кавычки, чтобы разрешить интерполяцию $i
, например:
$tmp = '"x $i y"'; # note double quotes inside
...
$var = eval $tmp;
Однако, eval
- довольно грубое решение любой такой проблемы. В большинстве случаев вы думаете, что вам это нужно, вам нужно подумать еще раз. Ваше решение может быть ссылками на код:
my $tmp = sub { my $num = shift; return "x $num y" };
for my $i (0 .. 5) {
print $tmp->($i);
}
Здесь вы не будете пытаться использовать фактический аргумент $i
в цикле for, а вместо этого передадите $i
в качестве аргумента для подпрограммы, которая использует его и возвращает строку.