我无法获得所需的输出 请帮助纠正我的错误。
file1
A
B
C
D
E
F
file2
A
D
C
所需输出 (如果在较大文件中找到相对位置打印'1',如果不打印'0'则
1
0
1
1
0
0
代码
#!/usr/bin/perl -w
open(FH,$file);
@q=<FH>;
open(FH1,$file2);
@d=<FH1>;
open(OUT,">out.txt");
foreach $i(@q) {
foreach $j(@d) {
if ($i eq $j) {
$id=1 ;
goto LABEL;
} elsif ($i ne $j) {
$id=1;
goto LABEL;
}
}
}
print OUT "1\t";
LABEL:
print OUT "0\t";
}
close FH;
close FH1;
close OUT;
注意:实际文件要大得多,包含不均匀的元素数。
答案 0 :(得分:2)
考虑以下方法:
use strict;
use warnings;
use autodie;
use feature 'say';
open my $fh1, '<', 'file1';
open my $fh2, '<', 'file2';
say <$fh1> eq <$fh2> ? '1' : '0'
until eof $fh1 or eof $fh2;
注意:
use strict; use warnings;
保持理智autodie
负责处理失败的文件open
s say
语法糖在每1或0结束时自动附加换行符eq
字符串 - 比较两行COND ? TRUE : FALSE
)决定是否打印1或0 until
是否定的while
eof
告诉循环当两个文件句柄中的任何一个用完时答案 1 :(得分:2)
您正在寻找
for $q (@q) {
my $found = 0;
for $d (@d) {
if ($q eq $d) {
$found = 1;
goto LABEL;
}
}
LABEL: print "$found\n";
}
以上内容写得更好:
for $q (@q) {
my $found = 0;
for $d (@d) {
if ($q eq $d) {
$found = 1;
last;
}
}
print "$found\n";
}
但这些解决方案表现不佳。您可以避免使用哈希重复迭代@d
。
my %d = map { $_ => 1 } @d;
for $q (@q) {
print $d{$q} ? "1" : "0", "\n";
}
答案 2 :(得分:1)
据说不要使用LABEL
。说实话,你不需要Perl,因为join和sed完成了工作(可能你需要先对文件进行排序):
join -a1 -a2 -e "0" -o 2.1 file1.txt file2.txt | sed "s/[^0]/1/g"
您可能需要先对文件进行排序 - 在这种情况下,请查看此帖子:comparing to unsorted files。
答案 3 :(得分:0)
说实话LABEL
不是你的朋友 - 不要这样做。对我而言,这听起来更像是join的工作。但是如果你想用Perl来解决它,我会尝试以下方法:
如果输入文件已排序(否则您可以使用sort来实现),逐行比较它们并打印结果:
while ($line_from_f1 = <F1>)
{
$line_from_f2=<F2>;
if ($line_from_f1 eq $line_from_f2)
{
print "1\n";
}
else
{
print "0\n";
}
}
较短版本(未经测试):
while (<F1>)
{
print ($_ eq <F2>)."\n";
}
注意:这些版本逐行比较文件 - 如果中间缺少一行,则无法正常工作。