0

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

文件 1

A  
B  
C 
D  
E
F 

文件2

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

4 回答 4

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的文件
  • 词法文件句柄优于裸词文件句柄
  • say语法糖在每 1 或 0 的末尾自动附加一个换行符
  • 菱形运算符逐行读取每个文件句柄
  • eq对两行进行字符串比较
  • 三元运算符 ( COND ? TRUE : FALSE) 决定打印 1 还是 0
  • until是一个否定的while
  • eof当两个文件句柄中的任何一个被用完时告诉循环
于 2013-08-26T08:33:17.547 回答
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";
}
于 2013-08-26T14:06:05.903 回答
1

正如所说,不要使用LABEL. 老实说,您不需要 perl,因为joinsed可以完成这项工作(可能您需要先对文件进行排序):

join -a1 -a2 -e "0" -o 2.1  file1.txt file2.txt | sed "s/[^0]/1/g"

可能您需要先对文件进行排序 - 在这种情况下,请查看这篇文章:与未排序的文件进行比较

于 2013-08-26T14:56:42.330 回答
0

老实说LABEL,这不是你的朋友——不要那样做。对我来说,这听起来更像是一份工作加入。但是,如果您想使用 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"; 
}

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

于 2013-08-26T08:27:14.073 回答