Re.pl: переменная, не соответствующая внутреннему блоку

Пример:

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

Является ли это документированной версией?

4 ответа

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

Вот демонстрация ошибки без 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.


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


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

Из Perlvar (Perl предопределенные переменные):

<span> $а</span> <span> $Ь​​STRONG > </span>

Специальные переменные пакета при использовании <span> <code>sort()</code></span>, <a href="http://perldoc.perl.org/functions/sort.html" rel="nofollow noreferrer" target="_blank">посмотреть сортировку</a>. Из-за этой специфичности $a и $b не нужно объявлять (используя <span> <code>use vars</code></span> или <span> <code>our()</code></span>) даже при использовании <span> <code>strict 'vars'</code></span>. Не используйте lexicalize с <span> <code>my $a</code></span> или <span> <code>my $b</code></span>, если вы хотите использовать их в блоке сравнения <span> <code>sort()</code></span> или функции.


Это не происходит, если вы запускаете свой код непосредственно в интерпретаторе 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.

licensed under cc by-sa 3.0 with attribution.