Почему определенный sdf возвращает true в этом примере Perl? - PullRequest
3 голосов
/ 30 октября 2009

Я попробовал этот пример в Perl. Может кто-нибудь объяснить, почему это правда?

  if (defined sdf)  {   print "true";  }

Он печатает true.

sdf может быть любым именем.

Кроме того, если определена функция sdf и она возвращает 0, то она ничего не печатает.

print (sdf); не печатает строку sdf, но

if (sdf eq "sdf")
{
 print "true";
}

печатает true.

Похожий вопрос остается, если sdf является строкой. Что это не напечатано печатью?

Ответы [ 5 ]

10 голосов
/ 30 октября 2009

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, чтобы избежать таких случаев.

5 голосов
/ 30 октября 2009

Это " голое слово ". Если это разрешено, оно имеет значение "sdf" и поэтому не является неопределенным.

4 голосов
/ 30 октября 2009

Пример не особенный:

telemachus ~ $ perl -e 'if (defined sdf) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined abc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined ccc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined 8) { print "True\n" };'
True

Ни один из них не эквивалентен undef, что defined проверяет.

Возможно, вы захотите проверить эту статью об истине в Perl: Что такое Истина?

3 голосов
/ 30 октября 2009

defined возвращает значение true, если выражение имеет значение, отличное от неопределенного значения.

0 голосов
/ 30 октября 2009

определенная функция возвращает true, если значение, переданное в аргументе, не определено. Это полезно, если отличить переменную, содержащую 0 или "" от переменной, которая только что появилась.

...