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