2013-08-13 6 views
0

Несмотря на то, что он заключен в двойные кавычки и %s должен быть интерполирован на несуществующий хеш, это действительный Perl и выдает "confusing = true".

#!/usr/bin/perl -w 
use strict; 

my $what = "confusing = %s"; 
printf $what, "true"; 

Однако это не действует (как и ожидалось), потому что $ s не существует:

my $what = "confusing = $s"; 
+6

Совсем связанно: http://stackoverflow.com/questions/6731291/why-doesnt-perl-support-interpolation-of-hashes-in-double-quotes – pilcrow

+0

Спасибо pilcrow. Я отвечу цитату Натана Торкингтона в качестве ответа. «Большая проблема в том, что% сильно используется в строках с двойными кавычками с printf». –

+0

@pilcrow Не имеет отношения; обратите внимание, что это вызов 'printf', который обрабатывает'% s' в своей строке форматирования определенным определенным образом, а не вызовом 'print', в котором'% s' является сомнительным, и применимо к Torkington's dictum. –

ответ

5

Вы говорите, что «%s» должен быть интерполирован на несуществующий хеш «, но он не должен. Не существует хэш-интерполяции. Это возможно в Perl 6.

3

Вы пропусканием спецификатор формата и значение printf, и он ведет себя так, как предполагалось; это может выглядеть как хэш-интерполяция, но это не так.

Дополнительную информацию о спецификаторах формата см. В perldoc -f sprintf; Короче говоря, %s в спецификаторе формата указывает, что значение должно быть интерполировано в виде строки, эффект в этом случае идентичен print "confusing = $what".

Если заменить printf с print, то %s будет восприниматься буквально, а не как переменная интерполяции, и результат будет confusing = %s; это, а не призыв к printf, - это случай, в котором применяется изречение Торкингтона.

4

Кроме того, хеши не интерполируются в двойных кавычках; скаляры (включая элементы хэша) и массивы.

Смежные вопросы