所以我有两个变量
$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
?在这种情况下,为什么我需要大括号?
答案 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
这就是为什么它无法正确理解你的变量名。所以你需要括号。