我正在阅读一本perl食谱,并在下面看到并想知道为什么需要\
?
我认为它应该可以在没有它的情况下工作(就像${ somefunction() }
一样,但我确实看到它在没有\
的情况下不起作用
$phrase = "I have ${\($n + 1)} guanacos.";
答案 0 :(得分:2)
print \($n + 1)
会显示SCALAR(0x24843d0)
,表示标量参考。
${\($n + 1)}
将取消引用标量参考,将其变为标量。
圆括号()
在这里有点棘手。它们是列表构造函数,因此可以认为对列表的引用会给出数组引用。但事实并非如此。事实上,\(1, 2, 3)
将为您提供三个标量引用的列表。同样,\(1)
将是一个标量引用的列表。
Making References part of perlref中解释了这一点。
对枚举列表的引用与使用不同 方括号 - 而不是创建列表 引用!
@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 ''
或使用sprintf
。
my $phrase = sprintf "I have %d guanacos", $n + 1; # or with single quotes ''
这两种方式都更具可读性,做同样的事情,并且它们的速度没有可测量的差异。清洁代码应始终是您的主要目标。聪明有时很好,但通常你先为人类编写代码。
您应该阅读perlref和perlreftut。