2016-06-23 32 views
1

所以,我有兩個變量Perl的QQ,並強調

$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); 

爲什麼unde rscore不適用於qq?爲什麼在這種情況下需要大括號?

+0

'qq($ x_ $ y)'與'$ x_完全一樣。 $ y'。你需要curlies,因爲那不是你想要的。 – ikegami

+1

回覆:爲什麼下劃線不能和qq一起工作?'這不僅僅是'qq()',你會用'$ x_ $ y'來解決同樣的問題;'因爲在答案中解釋了原因。 –

回答

7

這是因爲_計數作爲標識符的字母(如變量名)。

當你編寫"$x_$y"時,Perl認爲你想插入兩個變量,$x_$y。同樣,當您編寫"$foo$bar"時,Perl認爲您正在嘗試插入$foo$bar(而不是$f . 'oo' . $bar$fo . 'o' . $bar或任何其他組合)。

一般規則是:名稱儘可能地向右延伸(也就是說,Perl爲標識符選擇最長的可能解釋)。

4

下劃線_是在變量名稱中使用的合法字符,因此當您說"$x_$y"時,您指的是(評估)一個明顯未定義的變量$x_

例如,請參閱this post中對此的接受答案以及更多此類信息。

+1

說真的,你是我們最好的人之一,當你的「得分」與你的能力相匹配時,我會很高興 – Borodin

+1

@Borodin哦,呃,你說得太好了,謝謝。 (現在_that_令人尷尬。)現在我需要努力工作,真的很難!所以,也許幾年下來,這是有點真實:)。感謝您一直以來的幫助。我現在要整理一下,所有這些都是個人的,所以OT – zdim

3

因爲下劃線可能是標識符的一部分。否則,解析器應該如何區分$ x $ x_?

所以括號說,只有x是IDENTIFER,不X_

2

如果你想要你的方式,那麼你應該逃避下劃線字符。

use strict; 
use warnings; 

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

print $z; 

當然我想建議這不是更好的方法。花括號的方式是最好的方法。