Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl食谱—;字符串内的插值函数_Perl - Fatal编程技术网

Perl食谱—;字符串内的插值函数

Perl食谱—;字符串内的插值函数,perl,Perl,我正在读一本perl烹饪书,看到下面,我想知道为什么这里需要\ 我认为它应该在没有它的情况下工作(就像${somefunction()}但是我确实看到没有\ $phrase = "I have ${\($n + 1)} guanacos."; 将显示标量(0x24843d0),表示标量引用 将取消对标量ref的引用,将其转换为标量 括号()在这里有点棘手。它们是列表构造函数,因此人们可能认为对列表的引用将给出一个数组引用。但事实并非如此。事实上,\(1,2,3)将给出一个包含三个标量引用的列表

我正在读一本perl烹饪书,看到下面,我想知道为什么这里需要
\

我认为它应该在没有它的情况下工作(就像
${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 ''