Perl:是什么意思。=〜

时间:2015-04-23 10:19:15

标签: perl operators operator-precedence

在perl脚本中,我偶尔会写

val wordcountperfile = file.map(line => (line.split("\t")(1).split(" ").flatMap(word => word), line.split("\t")(0))).map(word => (word, 1)).reduceByKey(_ + _)

未打印预期结果my $s = "text"; $s .=~ " another text"; print "$s\n"; ,而是在我的终端中显示text another text这个奇怪的文字。

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

但我很好奇:为什么没有.=语法错误?这个操作的意义是什么?

3 个答案:

答案 0 :(得分:9)

.=~是两个运营商.=~。波浪号是二元否定运算符,请参阅perlop

验证

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

答案 1 :(得分: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

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

答案 2 :(得分:3)

当choroba不在时;)你可以使用B::Deparseppi_dumper告诉你你正在处理什么(.=~

$ 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       ';'