我想查找 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;
答案 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";
}