将一行中某个位置的字符与同一位置的其余行进行比较的简单方法(Perl)

urb*_*ter 3 perl comparison position character

我有一个包含许多行的文件,想要进行比较,看看特定列的所有字符是否与Perl中的其余文件匹配.例如,如果我有一个文件:

abcdefg
avcddeg
acbdeeg
Run Code Online (Sandbox Code Playgroud)

该文件将读取a,d,g作为匹配并返回位置.

我正在考虑在perl中使用2D数组来遍历和比较整个文件,但它可能会变得乏味.有没有人有更简单的方法来做到这一点?

谢谢

Ilm*_*nen 7

这是一个使用按位运算的聪明(快速)解决方案.它依赖于一个事实,a & b & ... & z等于a | b | ... | z当且仅当所有的a,b,...,z都是平等的.

# read first line:
chomp( $_ = <> );
my $join = my $meet = $_;

# read other lines:
while( <> ) {
    chomp;
    $join |= $_;
    $meet &= $_;
}

# print matching columns:
foreach my $i ( 0 .. length($meet) - 1 ) {
    my $a = substr $join, $i, 1;
    my $b = substr $meet, $i, 1;
    print "$i: $a\n" if $a eq $b;
}
Run Code Online (Sandbox Code Playgroud)

测试输入:

abcdefg
avcddeg
acbdeeg
Run Code Online (Sandbox Code Playgroud)

输出:

0: a
3: d
6: g
Run Code Online (Sandbox Code Playgroud)

PS.即使线条长度不同,此解决方案仍可正常工作; 超出最短线末尾的列将被视为匹配.

  • 该声明适用于任何位串.由于我的输出循环逐字符地比较字符串,因此它会生成匹配字符列表.(请记住,在字符串上使用像`&`和`|`这样的按位操作只适用于并行操作字符串的每个位 - 这就是为什么它们被称为"按位".)我可以使用它` vec`而不是`substr`来产生匹配位(或半字节或其他)的列表. (2认同)