perl cookbook fixstyle2 by& 1

时间:2017-11-09 08:03:01

标签: perl

再一次perl cookbook,我知道这个程序做了什么,我理解了大部分内容,但是代码下面的代码让我感到惊讶。 它基本上是使用if else但是($ i ++& 1)是什么意思??

#!/usr/bin/perl -w
# fixstyle2 - like fixstyle but faster for many many matches
use strict;
my $verbose = (@ARGV && $ARGV[0] eq '-v' && shift);
my %change = ();
while (<DATA>) {
    chomp;
    my ($in, $out) = split /\s*=>\s*/;
    next unless $in && $out;
    $change{$in} = $out;
}
if (@ARGV) {
    $^I = ".orig";
} else {
    warn "$0: Reading from stdin\n" if -t STDIN;
}
while (<>) {
    my $i = 0;
    s/^(\s+)// && print $1;         # emit leading whitespace
    for (split /(\s+)/, $_, -1) {   # preserve trailing whitespace
        print( ($i++ & 1) ? $_ : ($change{$_} || $_));
    }
}
 __END__
analysed   analyzed

1 个答案:

答案 0 :(得分:1)

$i++返回$ i的值,然后递增$ i。 &是&#34;按位和&#34;运算符,所以它需要前面提到的$ i值并检查它的最后一位(二进制中的1是00..01)。

由于$ i在每次迭代中递增1,因此在二进制中,其最后一位从1变为0,反之亦然,因此表达式只能确定奇数与偶数单词。