在perl中搜索文件中的一行

时间:2012-09-12 12:10:05

标签: perl

我想查找 tobecompared 文件中的特定行, SourceFile 中的不可用。我有一个错误,我不能找到

open INPUT, "SourceFile";
@input = <INPUT>;
close INPUT;

open FILE, "tobecompared";
while (<FILE>){

    if (/>/) {

        push(@array, $_);
    }
}
foreach $temp (@array) {

    $temp =~ s/>//;
    $temp =~ s/\s.*\n$//g;

    if  (@input !~ $temp){

        print $temp."\n";                   
    }
}
close FILE;

2 个答案:

答案 0 :(得分:4)

在你的代码中

if (@input !~ $temp){

    print $temp."\n";                   
}

变量@input在标量上下文中计算,它返回@input中元素的数量。因此,除非SourceFile中的行数与tobecompared中的任何行匹配,否则会打印一行,然后在一些修改后将其解释为正则表达式。

除了你需要做的任何修改之外,问题的标准解决方案“打印fileA中不在fileB中的所有行”是将fileB中的所有行读入散列键,然后使用exists。那就是:

my %seen;
open my $fh, '<', "fileB"
    or die "Ooops";

while (<$fh>) {

    $seen{$_} = 1;
}
close $fh;

open my $source, '<', "fileA"
    or die "Ooops";

while (<$source>) {

    print $_ unless exists $seen{$_};
}
close $source;

当然,你可以在向%看到的行中添加行之前添加任何修改,然后在%see中测试是否存在。

答案 1 :(得分:1)

您无法将数组与!~Applying pattern match (m//) to @array will act on scalar(@array) at d.pl line 24)匹配,但您可以加入数组并与之匹配:

use warnings;
use strict;

my $input = join("", @input);

# ....

if  ($input !~ $temp){

    print $temp."\n";                   
}