2015-04-23 78 views
3

在Perl腳本,我偶爾會寫的Perl:什麼意思=〜

my $s = "text"; 
$s .=~ " another text"; 
print "$s\n"; 

預期結果未印刷text another text,而不是怪異的文本textߞ������ߋ���結果顯示在我的終端。

毫無疑問:錯誤是運營商.=~而事實上,我想寫.=

但我很好奇:爲什麼不是.=~語法錯誤?這個操作的意義是什麼?

回答

3

當choroba不在身邊;),可以使用B::Deparse和​​告訴你,你正在處理什麼用(.=~

$ perl -MO=Deparse,-p -e " $foo .=~ /bar/; " 
($foo .= (~/bar/)); 
-e syntax OK 


$ ppi_dumper foo.pl 
PPI::Document 
    PPI::Statement 
    PPI::Token::Symbol   '$foo' 
    PPI::Token::Whitespace  ' ' 
    PPI::Token::Operator  '.=' 
    PPI::Token::Operator  '~' 
    PPI::Token::Whitespace  ' ' 
    PPI::Token::Regexp::Match '/bar/' 
    PPI::Token::Structure  ';' 
+0

他身邊,並建議相同。我從來沒有聽說過'B :: Deparse',所以你的答案會產生有價值的消息 - 謝謝 – leu

9

.=~是兩個運營商,.=~。代字符是二進制否定運算符,請參閱perlop

驗證:

$ perl -MO=Deparse,-p -e '$x .=~ $y' 
($x .= (~$y)); 
-e syntax OK 
+0

有趣。這裏的優先順序是什麼?因爲還使用'=〜' – fedorqui

+0

@fedorqui:檢查文檔頂部的優先表。 – choroba

+0

不確定。我看到'離開\t =〜!〜'爲第6個優先,而第8個項目符號出現'.'。 – fedorqui

8

Perl的時正在做一些你無法理解的語法,你可以用B :: Deparse或B :: Concise來弄清楚。

B :: Deparse

運行

$ perl -MO=Deparse 
該代碼產量

my $s = 'text'; 
$s .= "\337\236\221\220\213\227\232\215\337\213\232\207\213"; 
print "$s\n"; 

B ::簡明

運行

$ perl -MO=Concise,-exec 

該代碼產生:

1 <0> enter 
2 <;> nextstate(main 1 -:1) v:{ 
3 <$> const[PV "text"] s 
4 <0> padsv[$s:1,2] sRM*/LVINTRO 
5 <2> sassign vKS/2 
6 <;> nextstate(main 2 -:2) v:{ 
7 <0> padsv[$s:1,2] sRM 
8 <$> const[PV "\337\236\221\220\213\227\232\215\337\213\232\207\213"] s 
9 <2> concat[t3] vKS/2 
a <;> nextstate(main 2 -:3) v:{ 
b <0> pushmark s 
c <0> padsv[$s:1,2] s 
d <$> const[PV "\n"] s 
e <2> concat[t4] sK/2 
f <@> print vK 
g <@> leave[1 ref] vKP/REFC 

在這兩種情況下,答案是一樣的。你有一個字面上充滿了一羣怪人角色。這是編譯器在編譯時對文字應用一元位按位否定~並將結果存儲在分析樹中的結果。