Perl qq和下划线

时间:2016-06-23 05:28:41

标签: string perl quotes

所以我有两个变量

$x = q(foo);
$y = q(bar);

我的目标是在第三个变量中使用它们,它们之间有下划线,即foo_bar。有很多方法可以做到这一点,但我想使用qq

所以

$z = qq($x_$y);

这会出现以下错误

Global symbol "$x_" requires explicit package name at test.pl line 45.
Execution of C:\test.pl aborted due to compilation errors.

所以我必须在变量x上使用大括号才能使其正常工作

$z = qq(${x}_$y);

为什么下划线不适用于qq?在这种情况下,为什么我需要大括号?

5 个答案:

答案 0 :(得分:7)

这是因为CustomWidth计为标识符中的字母(例如变量名称)。

当您撰写private double CustomWidth; public MainPage() { this.InitializeComponent(); CustomWidth = Window.Current.Bounds.Width; } 时,Perl认为您正在尝试插入两个变量_"$x_$y"。同样,当您撰写$x_时,Perl会认为您正在尝试插入$y"$foo$bar"(不是$foo$bar或任何其他组合)

一般规则是:名称尽可能向右扩展(即,Perl为标识符选择最长的解释)。

答案 1 :(得分:4)

下划线_是一个在变量名中使用的合法字符,所以当你说"$x_$y"时你指的是(评估)一个变量$x_,它显然还没有被定义

例如,请参阅this post中已接受的答案以及更多此类答案。

答案 2 :(得分:3)

因为下划线可能是标识符的一部分。否则,解析器应该如何区分来自$ x_?

的$ x

所以大括号说只有x才是标识符,而不是x _

答案 3 :(得分:2)

如果你想按自己的方式行事,那么你应该逃避下划线的角色。

use strict;
use warnings;

my $x =qq(foo);
my $y=qq(bar);
my $z = qq($x\_$y);

print $z;

当然我想建议这不是更好的方法。花括号方式是最好的方法。

答案 4 :(得分:1)

根据perl变量命名rull'下划线'可以是变量名称的一部分。参考:http://sivasakthikumar.blogspot.in/2009/03/variable-names-can-start-with-letter_16.html

这就是为什么它无法正确理解你的变量名。所以你需要括号。