在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