Perl:这是什么意思.=〜

leu*_*leu 3 perl operators operator-precedence

在perl脚本中,我偶尔写道

my $s = "text";
$s .=~ " another text";
print "$s\n";
Run Code Online (Sandbox Code Playgroud)

text another text没有打印预期的结果,而是text???????????我的终端中显示的奇怪文本.

毫无疑问:错误是操作员.=~确实,我想写.=

但我很好奇:为什么不是.=~语法错误?这次行动的意义是什么?

cho*_*oba 9

.=~是两个运营商,.=~.波浪号是二元否定算子,见perlop.

验证:

$ perl -MO=Deparse,-p -e '$x .=~ $y'
($x .= (~$y));
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

  • 它不是由优先权决定的.只有当你知道你拥有什么标记时,优先权才会发挥作用.tokenizer将始终找到最大的令牌,否则它永远不会工作.所以当它找到`.`时,它看到它跟着`=`,它返回`.=`运算符. (3认同)

tch*_*ist 8

当Perl做一些你不懂语法的东西时,你可以用B :: Deparse或B :: Concise搞清楚.

B :: Deparse

运行

$ perl -MO=Deparse
Run Code Online (Sandbox Code Playgroud)

在该代码上产生:

my $s = 'text';
$s .= "\337\236\221\220\213\227\232\215\337\213\232\207\213";
print "$s\n";
Run Code Online (Sandbox Code Playgroud)

B ::简明

运行

$ perl -MO=Concise,-exec 
Run Code Online (Sandbox Code Playgroud)

在该代码上产生:

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
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,答案都是一样的.你有一个充满了一堆怪异角色的文字.这是编译器~在编译时将一元按位否定应用于文字并将结果存储在解析树中的结果.