Perl食谱—;字符串内的插值函数
我正在读一本perl烹饪书,看到下面,我想知道为什么这里需要Perl食谱—;字符串内的插值函数,perl,Perl,我正在读一本perl烹饪书,看到下面,我想知道为什么这里需要\ 我认为它应该在没有它的情况下工作(就像${somefunction()}但是我确实看到没有\ $phrase = "I have ${\($n + 1)} guanacos."; 将显示标量(0x24843d0),表示标量引用 将取消对标量ref的引用,将其转换为标量 括号()在这里有点棘手。它们是列表构造函数,因此人们可能认为对列表的引用将给出一个数组引用。但事实并非如此。事实上,\(1,2,3)将给出一个包含三个标量引用的列表
\
我认为它应该在没有它的情况下工作(就像${somefunction()}
但是我确实看到没有\
$phrase = "I have ${\($n + 1)} guanacos.";
将显示标量(0x24843d0),表示标量引用
将取消对标量ref的引用,将其转换为标量
括号()
在这里有点棘手。它们是列表构造函数,因此人们可能认为对列表的引用将给出一个数组引用。但事实并非如此。事实上,\(1,2,3)
将给出一个包含三个标量引用的列表。同样,\(1)
将是一个包含一个标量引用的列表
这一点在本节中进行了解释
引用枚举列表与使用
方括号——相反,它与创建
推荐人
@list = (\$a, \@b, \%c);
@list = \($a, @b, %c); # same thing!
在插值中使用这个ref/deref构造是一个技巧,可以在插值中执行Perl并计算更复杂的表达式。没有它,就无法获得$n+1
但请注意,这不是最可读的代码,最好是将字符串分成这样的片段
my $phrase = "I have " . $n + 1 . " guanacos."; # or with single quotes ''
或使用
这两种方法都更具可读性,做同样的事情,而且它们的速度没有可测量的差异。干净的代码应该始终是你的主要目标。聪明有时是好的,但通常你先为人类编写代码
您可能应该阅读和。这太奇怪了。我知道参考资料,但显然我不完全理解。非常感谢您!!@user3502374请查看我的更新。我已经解决了我认为让您困惑的问题。@Zaid感谢您纠正了错误。我无意中重写了它,但后来自己修复了它。:)不用担心。也同意你的最后一句话:聪明有时是好的,但善良通常更聪明:)@Zaid现在很多Perl社区的人在Twitter上使用这种ref/deref模式作为他们的名字。我试着为他们为什么这样做找到一个参考(完全是双关语),但似乎我不在这个笑话中。你知道为什么吗?我认为这在文化上符合这个问题。
@list = (\$a, \@b, \%c);
@list = \($a, @b, %c); # same thing!
my $phrase = "I have " . $n + 1 . " guanacos."; # or with single quotes ''
my $phrase = sprintf "I have %d guanacos", $n + 1; # or with single quotes ''