-3

我想在要比较的文件中查找特定行,这些行在我的 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;
4

2 回答 2

4

在你的代码中

if (@input !~ $temp){

    print $temp."\n";                   
}

该变量@input在标量上下文中进行评估,它返回@input. 所以你打印你的行,除非 SourceFile 中的行数与 tobecompared 中的任何行匹配,在经过一些修改后解释为正则表达式。

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

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;

您当然可以在向 %seen 添加行之前以及在测试 %seen 中是否存在之前添加任何修改。

于 2012-09-12T12:27:38.200 回答
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";                   
}
于 2012-09-12T12:25:10.770 回答