Инициализация Perl переменных с помощью eval

Думаю, это должно быть что-то очевидное для тех, кто знает Perl, но я просто не понимаю... Я также полагаю, что это должно быть связано с проблемами, описанными в Perl scoping " darkness " - но я не могу применить ничего из этого в моем случае.

В любом случае, вот код:

#!/usr/bin/env perl
# call with:
# ./test.pl

use strict;

my $tvars = "my \$varA = 1;
my \$varB = 2;
my \$varC = 3;
";

my @lines = split /\n/, $tvars;
foreach my $line (@lines) {
  print "$line\n";
  eval $line; warn $@ if $@;
}

#~ print "$varA\n"; # Global symbol "$varA" requires explicit package name at ./test.pl line 18.
#~ print "$varB\n"; # Global symbol "$varB" requires explicit package name at ./test.pl line 19.
#~ print "$varC\n"; # Global symbol "$varC" requires explicit package name at ./test.pl line 20.

$tvars = "our \$varA = 1;
our \$varB = 2;
our \$varC = 3;
";

@lines = split /\n/, $tvars;
foreach my $line (@lines) {
  print "$line\n";
  eval $line; warn $@ if $@;
}

print "$varA\n"; # Global symbol "$varA" requires explicit package name at ./test.pl line 33.
print "$varB\n"; # Global symbol "$varB" requires explicit package name at ./test.pl line 34.
print "$varC\n"; # Global symbol "$varC" requires explicit package name at ./test.pl line 35.

Проще говоря, я хотел бы, чтобы что-то вроде "$varA = 1;" было написано как строка (текстовый файл); и я бы хотел, чтобы perl до eval было написано так, чтобы потом в том же скрипте у меня был доступ к переменной "$varA" - ошибки, которые я получаю, когда пытаюсь получить доступ к ним после eval, находятся в комментариях к вышеуказанному коду (однако во время eval никаких предупреждений не поступало)). ( полагаю, что мне понадобится что-то вроде "глобальных" переменных, если eval будет работать в другом контексте, чем основной сценарий?)

Как бы я это сделал? Должен ли я пройти через весь этот процесс определения пакета, даже для такого простого сценария, как описанный выше?

Заранее большое спасибо за любые ответы,
. За Ваше здоровье!

7
задан sdaau 21 September 2011 в 21:18
поделиться