Вы уже процитировали 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
, для передачи параметров.Сравните также похожие идиомы на интерфейсах командной строки, где опции обычно начинаются с тире.