Perl qq 和下划线

Perl qq and underscore

提问人:ontherocks 提问时间:6/23/2016 更新时间:6/23/2016 访问量:1618

问:

所以我有两个变量

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

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

所以

$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 引号

评论

0赞 ikegami 6/23/2016
qq($x_$y)与 完全相同。你需要卷发,因为那不是你想要的。$x_ . $y
1赞 mpapec 6/23/2016
回复:这不仅仅是 ,因为在答案中解释的原因,您会遇到同样的问题。Why does underscore not work with qq?qq()"$x_$y";

答:

1赞 Arijit Panda 6/23/2016 #1

根据 perl 变量命名,rull 'underscore' 可以是变量名称的一部分。编号 : http://sivasakthikumar.blogspot.in/2009/03/variable-names-can-start-with-letter_16.html

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

4赞 zdim 6/23/2016 #2

下划线是变量名称中使用的合法字符,因此当您说您指的是(评估)变量时,该变量显然尚未定义。_"$x_$y"$x_

例如,请参阅这篇文章中对此的公认答案以及更多此类答案。

评论

1赞 Borodin 6/24/2016
说真的,你是我们这里最好的,当你的“分数”与你的能力相匹配时,我会很高兴
1赞 zdim 6/24/2016
@Borodin 哦,呃,你说得太客气了,谢谢你。(现在这很尴尬。现在我需要非常非常努力地工作!因此,也许几年后,这在某种程度上是真实的:)。感谢您一路以来的帮助。我现在要收拾一下,所有这些都是个人的,所以 OT
3赞 Alexandr Evstigneev 6/23/2016 #3

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

所以大括号说只有 x 是同等的,而不是x_

7赞 melpomene 6/23/2016 #4

这是因为在标识符(例如变量名称)中算作一个字母。_

当你写 时,Perl 认为你正在尝试插值两个变量,并且 .类似地,当你写 时,Perl 认为你正在尝试插值 and(不是 or 或任何其他组合)。"$x_$y"$x_$y"$foo$bar"$foo$bar$f . 'oo' . $bar$fo . 'o' . $bar

一般规则是:名称尽可能向右延伸(也就是说,Perl 为标识符选择尽可能长的解释)。

2赞 Nagaraju 6/23/2016 #5

如果你想要你的方式,那么你应该直接转义下划线字符。

use strict;
use warnings;

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

print $z;

当然,我想建议这不是更好的方法。卷曲的支撑方式是最更好的方法。