Perl qq和下划线

ont*_*cks 1 string quotes perl

所以我有两个变量

$x = q(foo);
$y = q(bar);
Run Code Online (Sandbox Code Playgroud)

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

所以

$z = qq($x_$y);
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误

Global symbol "$x_" requires explicit package name at test.pl line 45.
Execution of C:\test.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

所以我不得不使用大括号和变量x来使它工作

$z = qq(${x}_$y);
Run Code Online (Sandbox Code Playgroud)

为什么下划线不起作用qq?在这种情况下,为什么我需要大括号?

mel*_*ene 7

这是因为_计算标识符中的字母(例如变量名称).

当你写作时"$x_$y",Perl认为你正试图插入两个变量,$x_并且$y.同样,当你写"$foo$bar",Perl的认为你想插$foo$bar(没有$f . 'oo' . $bar$fo . 'o' . $bar或任何其他组合).

一般规则是:名称尽可能向右扩展(即,Perl为标识符选择最长的解释).


zdi*_*dim 5

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

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