Ошибка в perl autodie.pm?
Я ожидаю:
#!/usr/bin/perl
use autodie;
# autodie in effect here
{
no autodie;
# autodie is not in effect here
}
# autodie should be in effect here because of the supposedly lexical scope
# of autodie, but this doesn't die:
open my $i, '<', '/nonexistent';
Я основываю это на perldoc autodie
, который гласит:
Прагма "autodie" имеет лексическую область действия, что означает, что функции и подпрограммы, измененные с помощью "autodie", изменят только их поведение до конца закрывающего блока, файла или "eval"
Кроме того, { no autodie }
(в области видимости) является частью SYNOPSIS
use/no warnings
ведет себя так, как я ожидаю:
#!/usr/bin/perl
use warnings;
{
no warnings;
}
# This *does* generate a warning
print undef;
Я что-то пропустил или вы согласны с ошибкой в autodie? Я не нашел ничего в автоопределении buglist
This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi
РЕДАКТИРОВАТЬ: Я теперь подал отчет об ошибке
Ответы
Ответ 1
Я могу воспроизвести это с помощью v5.10.0 (Debian x86_64) и ActiveState 5.14.2.
Попробуйте это местоположение для отчетов об ошибках.
РЕДАКТИРОВАТЬ. Я протестировал несколько: чтобы обойти проблему до тех пор, пока ошибка не будет исправлена, вам нужно снова use
автодиа:
use strict;
use autodie;
do {
no autodie;
# ...
} while(0);
use autodie;
open FILE, '<', '/non-existing'; # dies again.
Ответ 2
Синопсис фактически не показывает директиву, имеющую лексическую область действия, но она упоминается несколько раз в другом месте документации. Это явно ошибка.
Возникает вопрос: сохраняется ли ошибка?
$ perl -E'use autodie; say $autodie::VERSION'
2.1001
$ perl -we'use autodie; { no autodie; } open(my $fh, "<", "nonexistant");'
$ perl -we'use autodie; open(my $fh, "<", "nonexistant");'
Can't open 'nonexistant' for reading: 'No such file or directory' at -e line 1
$ perl -we'{ use autodie; } open(my $fh, "<", "nonexistant");'
Да, да. Тем не менее, это только no autodie;
. Как ни странно, эта версия autodie новее, чем в настоящее время доступна на CPAN?! Поэтому я понизился и попытался снова.
$ perl -E'use autodie; say $autodie::VERSION'
2.10
$ perl -we'use autodie; { no autodie; } open(my $fh, "<", "nonexistant");'
$ perl -we'use autodie; open(my $fh, "<", "nonexistant");'
Can't open 'nonexistant' for reading: 'No such file or directory' at -e line 1
$ perl -we'{ use autodie; } open(my $fh, "<", "nonexistant");'
Ошибки могут быть отправлены с использованием autodie отслеживания ошибок.