Perl 支持两种字符串字面量形式 — 双引号(“)和单引号(’)。在双引号的字符串内部进行插值:变量和特殊符号如 、\t 被替换为它们的值。在单引号中没有插值 — 内容被字面理解。
示例:
my $name = "Alex"; print "Hello, $name! "; # Hello, Alex! print 'Hello, $name! '; # Hello, $name! # 通过花括号插值表达式: my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} — 这是将表达式结果安全插入字符串的方式。在什么情况下双引号字符串中的变量不会被插值?
回答: 当变量被转义(\$var)、在单引号内部,或者使用了花括号语法但不按预期使用,或者变量名没有被括号限制,并与字母“粘连”在一起。
my $world = 'earth'; print "Hello, $worlds! "; # 错误:变量 $worlds 不存在,而不是 $world + 字母 s
故事
在一个大型项目中,用于记录日志时使用了带变量的字符串:
my $file = '/tmp/data'; print LOG 'File: $file
';
期待看到文件路径,但日志中记录的是字面文本 `$file`,因为使用了单引号。问题在生产中发现。
故事
一位开发者在字符串中插入变量时未使用花括号:
my $user = "bob"; print "User: $user21
";
期望输出 `bob21`,但解释器开始寻找不存在的变量 `$user21`。这导致报告中出现空值。
故事
为了在字符串中显示表达式结果,使用了这样的代码:
my $a = 3; print "Sum: $a+5
"; # 期望:'Sum: 8',得到:'Sum: 3+5'
确实,插值只考虑变量,表达式被字面包含。需要通过 @{[ ... ]} 来工作。