sdf
является голым словом .
perl -Mstrict -e "print qq{defined\n} if defined sdf"
Bareword "sdf" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
Для большего удовольствия, попробуйте
perl -Mstrict -e "print sdf => qq{\n}"
См. Строго говоря, об использовании строго :
Аспект sub использования use strict отключает интерпретацию `` голых слов '' как текстовых строк. По умолчанию идентификатор Perl (последовательность букв, цифр и символов подчеркивания, не начинающаяся с цифры, если она не является полностью числовой), которая не является встроенным ключевым словом или ранее увиденным определением подпрограммы, обрабатывается как текстовая строка в кавычках:
@daynames = (sun, mon, tue, wed, thu, fri, sat);
Однако это считается опасной практикой, потому что могут получиться неясные ошибки:
@monthnames = (jan, feb, mar, apr, may, jun,
jul, aug, sep, oct, nov, dec);
Можете ли вы обнаружить ошибку? Да, 10-я запись - это не строка «oct», а скорее вызов встроенной функции oct()
, возвращающий числовой эквивалент значения по умолчанию $_
, рассматриваемого как восьмеричное число.
Исправлено: (спасибо @ysth)
E:\Home> perl -we "print sdf"
Unquoted string "sdf" may clash with future reserved word at -e line 1.
Name "main::sdf" used only once: possible typo at -e line 1.
print() on unopened filehandle sdf at -e line 1.
Если голое слово подается в print
в слоте косвенного объекта, оно берется в качестве дескриптора файла для печати. Поскольку никакие другие аргументы не предоставлены, print
по умолчанию печатает $_
с файловым дескриптором sdf
. Так как sdf
не был открыт, он не работает. Если вы запустите это без предупреждений, вы не увидите никакого вывода. Примечание также:
E:\Home> perl -MO=Deparse -e "print sdf"
print sdf $_;
как подтверждение этого наблюдения. Обратите внимание также:
E:\Home> perl -e "print asdfg, sadjkfsh"
No comma allowed after filehandle at -e line 1.
E:\Home> perl -e "print asdfg => sadjkfsh"
asdfgsadjkfsh
Последний печатает обе строки, потому что =>
автоматически заключает в кавычки строки в LHS, если они состоят исключительно из символов «слово», удаляя интерпретацию дескриптора файла первого аргумента.
Все эти примеры показывают, что использование голых слов приводит ко многим сюрпризам. Вам следует use strict
, чтобы избежать таких случаев.