使用goto LABEL比较两个文件

时间:2013-08-26 08:12:04

标签: perl goto

我无法获得所需的输出 请帮助纠正我的错误。

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;

注意:实际文件要大得多,包含不均匀的元素数

4 个答案:

答案 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
  • 词法文件句柄优于bareword文件句柄
  • say语法糖在每1或0结束时自动附加换行符
  • Diamond操作员逐行读入每个文件句柄
  • 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,因为joinsed完成了工作(可能你需要先对文件进行排序):

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"; 
}

注意:这些版本逐行比较文件 - 如果中间缺少一行,则无法正常工作。