即使它是双引号,并且%s
应该插入到不存在的哈希值,这是有效的Perl并输出"confusing = true"
。
#!/usr/bin/perl -w
use strict;
my $what = "confusing = %s";
printf $what, "true";
但是,这是无效的(如预期的那样),因为$ s不存在:
my $what = "confusing = $s";
答案 0 :(得分:5)
你说“%s
应该插入一个不存在的哈希”,但它不应该。没有哈希插值。但是在Perl 6中是可能的。
答案 1 :(得分:4)
此外,哈希不用双引号插值;标量(包括哈希元素)和数组是。
答案 2 :(得分:3)
您正在将格式说明符和值传递给printf
,并且它的行为符合预期;这可能看起来像一个哈希插值,但事实并非如此。
有关格式说明符的详细信息,请参阅perldoc -f sprintf
;简而言之,格式说明符中的%s
表示应将值插值为字符串,在这种情况下效果与print "confusing = $what"
相同。
如果您将printf
替换为print
,%s
将按字面意思采用,而不是作为变量插值,结果将为confusing = %s
;这个,而不是对printf
的召唤,就是托金顿的格言适用的情况。