提问人:ontherocks 提问时间:6/23/2016 更新时间:6/23/2016 访问量:1618
Perl qq 和下划线
Perl qq and underscore
问:
所以我有两个变量
$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
答:
根据 perl 变量命名,rull 'underscore' 可以是变量名称的一部分。编号 : http://sivasakthikumar.blogspot.in/2009/03/variable-names-can-start-with-letter_16.html
这就是为什么它无法正确理解您的变量名称的原因。所以你需要括号。
下划线是变量名称中使用的合法字符,因此当您说您指的是(评估)变量时,该变量显然尚未定义。_
"$x_$y"
$x_
例如,请参阅这篇文章
中对此的公认答案以及更多此类答案。
评论
因为下划线可能是标识符的一部分。否则,解析器应该如何区分$x和 $x_ ?
所以大括号说只有 x 是同等的,而不是x_
这是因为在标识符(例如变量名称)中算作一个字母。_
当你写 时,Perl 认为你正在尝试插值两个变量,并且 .类似地,当你写 时,Perl 认为你正在尝试插值 and(不是 or 或任何其他组合)。"$x_$y"
$x_
$y
"$foo$bar"
$foo
$bar
$f . 'oo' . $bar
$fo . 'o' . $bar
一般规则是:名称尽可能向右延伸(也就是说,Perl 为标识符选择尽可能长的解释)。
如果你想要你的方式,那么你应该直接转义下划线字符。
use strict;
use warnings;
my $x =qq(foo);
my $y=qq(bar);
my $z = qq($x\_$y);
print $z;
当然,我想建议这不是更好的方法。卷曲的支撑方式是最更好的方法。
评论
qq($x_$y)
与 完全相同。你需要卷发,因为那不是你想要的。$x_ . $y
Why does underscore not work with qq?
qq()
"$x_$y";