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;
当然我想建议这不是更好的方法。花括号方式是最好的方法。
所以我有两个变量
$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;
当然我想建议这不是更好的方法。花括号方式是最好的方法。