urb*_*ter 3 perl comparison position character
我有一个包含许多行的文件,想要进行比较,看看特定列的所有字符是否与Perl中的其余文件匹配.例如,如果我有一个文件:
abcdefg
avcddeg
acbdeeg
Run Code Online (Sandbox Code Playgroud)
该文件将读取a,d,g作为匹配并返回位置.
我正在考虑在perl中使用2D数组来遍历和比较整个文件,但它可能会变得乏味.有没有人有更简单的方法来做到这一点?
谢谢
这是一个使用按位运算的聪明(快速)解决方案.它依赖于一个事实,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.即使线条长度不同,此解决方案仍可正常工作; 超出最短线末尾的列将被视为匹配.