-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 の行数が何らかのマングリングの後に正規表現として解釈されるように比較される行と一致しない限り、行を出力します。

必要なマングリングを除いて、「fileBにないfileAのすべての行を出力する」という問題に対する標準的な解決策は、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;

もちろん、%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 に答える