2015-04-23 72 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 

在这两种情况下,答案是一样的。你有一个字面上充满了一群怪人角色。这是编译器在编译时对文字应用一元位按位否定~并将结果存储在分析树中的结果。