Почему опции переноса-переноса разрешены в строках `use` без жирной запятой и строгого? - PullRequest
0 голосов
/ 10 декабря 2018

Почему следующий use строчный допустимый синтаксис Perl?(Адаптировано из POD для родительского ; протестировано на Perl 5.26.2 x64 на Cygwin.)

package MyHash;
use strict;
use Tie::Hash;
use parent -norequire, "Tie::StdHash";
       #   ^^^^^^^^^^ A bareword with nothing to protect it!

При -MO=Deparse строка use становится

use parent ('-norequire', 'Tie::StdHash');

но я не могу сказать по use документам , откуда взято цитирование -norequire.

  • Если use strict не былов силу я бы это понял.Голое слово norequire станет строкой "norequire", унарный минус превратит эту строку в "-bareword", а полученная строка попадет в список импорта use,Например:

    package MyHash;
    use Tie::Hash;
    use parent -norequire, "Tie::StdHash";
    
  • Точно так же, если бы была жирная запятая, я бы это понял.-foo => bar становится "-foo", bar, потому что => превращает foo в "foo", а затем унарный минус снова начинает свою магию.Например:

    package MyHash;
    use strict;
    use Tie::Hash;
    use parent -norequire => "Tie::StdHash";
    

В обоих этих примерах выводится одинаковое значение для строки use.Тем не менее, оба цитируют, что в оригинальном примере нет.Чего мне не хватает, что делает исходный пример (с strict, без =>) легальным?Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы уже процитировали perldoc perlop, но здесь это уместно.

Unary - выполняет арифметическое отрицание, если операнд числовой, включая любую строку, которая выглядит какчисло.Если операнд является идентификатором, возвращается строка, состоящая из знака минус, соединенного с идентификатором.... Одним из следствий этих правил является то, что -bareword эквивалентно строке "-bareword".

Такое поведение унарного оператора минус применяется к голому слову до strict проверки применяются .Следовательно, унарный минус - это своего рода оператор цитирования, который также работает в строгом режиме.

Аналогично, голые слова в качестве инвоканта при вызове метода не нужно заключать в кавычки, если они не являются вызовом функции:

Foo->bar;    # 'Foo'->bar(); --- but only if no sub Foo exists
print->bar;  # print($_)->bar();

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

use strict;
0 ? foo : bar;

будет только жаловаться на то, что запрещается использование слова "bar", и предполагает, что проверка голого слова происходит очень поздно во время синтаксического анализа и компиляции.В случае унарного минуса, голое слово уже будет постоянно свернуто в правильное строковое значение в этой точке, и голое слово не останется видимым.

Хотя это, возможно, ошибочно, его также невозможно изменить, не нарушивобратная совместимость - и это поведение используется многими модулями, такими как use parent, для передачи параметров.Сравните также похожие идиомы на интерфейсах командной строки, где опции обычно начинаются с тире.

0 голосов
/ 10 декабря 2018

С perlop

Символьные унарные операторы

Унарный "-" выполняет арифметическое отрицание, если операнд числовой, включая любую строку, которая выглядит как число.Если операнд является идентификатором, возвращается строка, состоящая из знака минус, соединенного с идентификатором.В противном случае, если строка начинается с плюса или минуса, возвращается строка, начинающаяся с противоположного знака. Одним из следствий этих правил является то, что -bareword эквивалентно строке "-bareword". Если, однако, строка начинается с неалфавитного символа (исключая "+" или "-"), Perlпопытается преобразовать строку в числовое значение и выполнить арифметическое отрицание.Если строка не может быть чисто преобразована в числовое значение, Perl выдаст предупреждение. Аргумент «строка» не является числовым в отрицании (-) при ....

Так что из-за правил синтаксического анализа Perl -имя обрабатывается как "-name" даже под use strict

...