Perl cookbook - 在字符串

时间:2017-11-09 07:02:01

标签: perl

我正在阅读一本perl食谱,并在下面看到并想知道为什么需要\

我认为它应该可以在没有它的情况下工作(就像${ somefunction() }一样,但我确实看到它在没有\的情况下不起作用

$phrase = "I have ${\($n + 1)} guanacos.";

1 个答案:

答案 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 ''

这两种方式都更具可读性,做同样的事情,并且它们的速度没有可测量的差异。清洁代码应始终是您的主要目标。聪明有时很好,但通常你先为人类编写代码。

您应该阅读perlrefperlreftut