Почему эта ошибка о строгих подпрограммах срабатывает только при autod ie? - PullRequest
3 голосов
/ 23 января 2020

Учитывая такой код, я не получаю никаких предупреждений.

use strict;
use warnings;
open STDERR, '>&', STDOUT;

Учитывая этот код, я получаю фатальную ошибку.

use strict;
use warnings;
use autodie;
open STDERR, '>&', STDOUT;

Bareword "STDOUT" not разрешено при использовании «строгих подпрограмм» в строке ./test.pl 6. Выполнение ./test.pl прервано из-за ошибок компиляции.

Почему autodie указывает на строгие подпрограммы как источник этой ошибки - когда в первом примере была явно строгая ошибка, и у меня не было ошибки.

С diagnostics ошибка объясняется следующим образом ..

Bareword «STDOUT» не допускается, когда используются «строгие подпрограммы» в строке ./test.pl 7. Выполнение ./test.pl прервано из-за ошибок компиляции (# 1) (F) При использовании «строгих подпрограмм» - пустое слово допускается только в качестве идентификатора подпрограммы, в фигурных скобках или слева от символа «=>». Возможно, вам нужно предварительно объявить подпрограмму?

Все это можно решить, выполнив

open STDERR, '>&', *STDOUT;

Тогда это не голое слово, но почему специальное слово голое слово открыто для открытия без autod ie, а не с autod ie? Здесь что-то еще происходит?

1 Ответ

8 голосов
/ 23 января 2020

autodie выполняет свою задачу, экспортируя подпрограмму с именем open, которую Perl использует в пользу оператора open.

$ perl -MO=Concise,-exec -e'             open(my $fh, "<", "foo")'
...
8  <@> open[t3] vK/3
...

$ perl -MO=Concise,-exec -e'use autodie; open(my $fh, "<", "foo")'
...
7  <#> gv[*open] s
8  <1> entersub vKS
...

Оператор open имеет специальные правила синтаксического анализа, которые не может быть реплицирован прототипом [1] , поэтому оператор open не может быть точно реплицирован сабом. Это объясняет наблюдаемую разницу.


  1. Обычно prototype("CORE::opname") возвращает неопределенное значение для таких операторов, но prototype("CORE::open") неверно сообщает, что правила синтаксического анализа open эквивалентны *;$@ прототип.
...