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

这就是它无法理解您的变量名的原因properly.So您需要括号。

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

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

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

所以大括号表示只有 x 是标识符,而不是 x_

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

当你写 "$x_$y" 时,Perl 认为你试图插入两个变量,$x_$y。同样,当你写 "$foo$bar" 时,Perl 认为你试图插入 $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;

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