re.pl: переменная неправильно определена внутри блока - PullRequest
3 голосов
/ 08 июня 2011

Пример:

~ $ re.pl
$ { my $abc = 10 ; $abc }
10
$ $abc
10
$ 

Это задокументированная ошибка?

Ответы [ 4 ]

6 голосов
/ 08 июня 2011

Похоже, что это ошибка в Lexical :: Persistence , которую Devel :: REPL использует для управления лексической средой, сохраняющейся в нескольких eval с.

Вот демонстрация ошибки без Devel :: REPL.Этот код неправильно выдает значение $abc, 10, даже если он находится во внутренней области.

use strict;
use warnings;
use Lexical::Persistence;

my $environment = Lexical::Persistence->new;
$environment->call(sub {
    my $foo = shift;
    { my $abc = 10 };
    return $foo;
});

print $environment->get_context('_')->{'$abc'};

Я сообщил о ошибке в модуле, посмотримчто происходит!

Стоит также отметить, что Мэтт Траут (основной автор нового лексического модуля персистентности Devel :: REPL) Eval :: WithLexicals делает не страдают от этой проблемы:

use strict;
use warnings;
use Eval::WithLexicals;

my $environment = Eval::WithLexicals->new;
print $environment->eval('{ my $abc = 10 ; $abc }'), "\n";
print $environment->eval('$abc'), "\n";

производит 10, как и ожидалось, затем второй eval выдает ожидаемую Global symbol "$abc" requires explicit package name ошибку.

3 голосов
/ 08 июня 2011

$a и $b - специальные переменные, используемые для сортировки.см perldoc -f sort.

2 голосов
/ 08 июня 2011

Не используйте $a или $b.

С Perlvar (предопределенные переменные Perl) документация:

$ a $ b

Специальные переменные пакета при использовании sort(), см. Sort .Из-за этой особенности $ a и $ b не нужно объявлять (используя use vars или our()) даже при использовании strict 'vars' прагма.Не лексизируйте их с помощью my $a или my $b, если вы хотите использовать их в блоке сравнения или функции sort().

0 голосов
/ 08 июня 2011

Этого не произойдет, если вы запустите свой код прямо в интерпретаторе Perl:

$ perl -we '{ my $abc = 10 ; print "($abc)\n"; }; print "($abc)\n";'
Name "main::abc" used only once: possible typo at -e line 1.
(10)
Use of uninitialized value $abc in concatenation (.) or string at -e line 1.
()

Может быть, вы нашли ошибку в Devel :: REPL .

...