sdf
является bareword.
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}"
См Strictly speaking about 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()
, возвращая числовой эквивалент по умолчанию $_
, обработанного как восьмеричное число.
Исправлено: (спасибо @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.
Если bareword подается в 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
.
@Aftershock: Я обновил свой ответ, чтобы ответить на последний вопрос, который вы подняли. –