在Perl腳本,我偶爾會寫的Perl:什麼意思=〜
my $s = "text";
$s .=~ " another text";
print "$s\n";
預期結果未印刷text another text
,而不是怪異的文本textߞ������ߋ���
結果顯示在我的終端。
毫無疑問:錯誤是運營商.=~
而事實上,我想寫.=
但我很好奇:爲什麼不是.=~
語法錯誤?這個操作的意義是什麼?
在Perl腳本,我偶爾會寫的Perl:什麼意思=〜
my $s = "text";
$s .=~ " another text";
print "$s\n";
預期結果未印刷text another text
,而不是怪異的文本textߞ������ߋ���
結果顯示在我的終端。
毫無疑問:錯誤是運營商.=~
而事實上,我想寫.=
但我很好奇:爲什麼不是.=~
語法錯誤?這個操作的意義是什麼?
當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 ';'
Perl的時正在做一些你無法理解的語法,你可以用B :: Deparse或B :: Concise來弄清楚。
運行
$ perl -MO=Deparse
該代碼產量
:
my $s = 'text';
$s .= "\337\236\221\220\213\227\232\215\337\213\232\207\213";
print "$s\n";
運行
$ 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
在這兩種情況下,答案是一樣的。你有一個字面上充滿了一羣怪人角色。這是編譯器在編譯時對文字應用一元位按位否定~
並將結果存儲在分析樹中的結果。
他身邊,並建議相同。我從來沒有聽說過'B :: Deparse',所以你的答案會產生有價值的消息 - 謝謝 – leu