0

4 つのファイルがあり、各ファイルは独自の配列に読み込まれます。そこから、ファイル A、B、C を互いに比較します。各ステップで、欠落している数字のリストを出力します。

A と B を比較し、次に B と A を比較する B ではなく A にあるファイルのリストを印刷し、その逆も同様

A と C を比較し、次に C と A を比較する A では見つかったが C では見つからなかったファイルのリストを印刷し、その逆も同様

B と C および C と B を比較する B では見つかったが C では見つからなかったファイルのリストを印刷し、その逆も同様

次に、これらの比較から値を取得し、それらをファイル D と比較する必要があります。ファイル D にないファイルのみを出力します。

ここに私がこれまでに持っているコードがあります。これを行うためのより良い方法があると思います。これについて何らかの支援が必要です。

[コード]

sub compare {

    my ($nf, $of, $inf, $infw) = @_;

    open NF, $nf or die $!;
    my @note_file = <NF>;
    close NF;

    open OF, $of  or die $!;
    my @order_file = <OF>;
    close OF;

    open INF, $inf or die $!;
    my @invoice_file = <INF>;
    close INF;

    open INFW, $infw or die $!;
    my @invoicefw_file = <INFW>;
    close INFW;

    my $lc1 = List::Compare->new(\@note_file,\@order_file); 
    my @unique_in_note_file = $lc1->get_unique;
    my @unique_in_order_file = $lc1->get_complement;
    print "The following files exist only in the Brighton-Note file and not in the Brighton-Order file : " . "\n\n" . join("\n", @unique_in_note_file) . "\n" if(scalar(@unique_in_note_file) > 0);
    print "The following files exist only in the Brighton-Order file and not in the Brighton-Note file : " . "\n\n" . join("\n", @unique_in_order_file) . "\n" if(scalar(@unique_in_order_file) > 0);

    my $lc2 = List::Compare->new(\@note_file,\@invoice_file);
    @unique_in_note_file = $lc2->get_unique;
    my @unique_in_invoice_file = $lc2->get_complement;
    print "The following files exist only in the Brighton-Note file and not in the Web-Sales file : " . "\n\n" . join("\n", @unique_in_note_file) . "\n" if(scalar(@unique_in_note_file) > 0);
    print "The following files exist only in the Web-Sales file  and not in th Brighton-Note file : " . "\n\n" . join("\n", @unique_in_invoice_file) . "\n" if(scalar(@unique_in_invoice_file) > 0);

    my $lc3 = List::Compare->new(\@order_file, \@invoice_file);
    @unique_in_order_file = $lc3->get_unique;
    @unique_in_invoice_file = $lc3->get_complement;
    print "The following files exist only in the Brighton-Order file and not in the Web-Sales file : " . "\n\n" . join("\n", @unique_in_order_file) . "\n" if(scalar(@unique_in_order_file) > 0);
    print "The following files exist only in the Web-Sales file  and not in th Brighton-Order file : " . "\n\n" . join("\n", @unique_in_invoice_file) . "\n" if(scalar(@unique_in_invoice_file) > 0);

    my $lc4 = List::Compare->new(\@unique_in_note_file,\@invoicefw_file);
    my @unique_in_notefw_file = $lc4->get_unique;
    my @unique_in_invoicefw_file = $lc4->get_complement;
    print "The following files exist only in the Brighton-Note file and not in the Web-SalesFW file : " . "\n\n" . join("\n", @unique_in_notefw_file) . "\n" if(scalar(@unique_in_notefw_file) > 0);
    print "The following files exist only in the Web-SalesFW file  and not in th Brighton-Note file : " . "\n\n" . join("\n", @unique_in_invoicefw_file) . "\n" if(scalar(@unique_in_invoicefw_file) > 0);

    my $lc5 = List::Compare->new(\@unique_in_order_file,\@invoicefw_file);
    my @unique_in_orderfw_file = $lc5->get_unique;
    @unique_in_invoicefw_file = $lc5->get_complement;
    print "The following files exist only in the Brighton-Order file and not in the Web-SalesFW file : " . "\n\n" . join("\n", @unique_in_orderfw_file) . "\n" if(scalar(@unique_in_orderfw_file) > 0);
    print "The following files exist only in the Web-SalesFW file  and not in th Brighton-Order file : " . "\n\n" . join("\n", @unique_in_invoicefw_file) . "\n" if(scalar(@unique_in_invoicefw_file) > 0);

}
4

1 に答える 1

4

2 つのファイルでこれを行う一般的な方法は次のとおりです。

my %items;
while (<$file1>) {
  $items{$_}++;
}
while (<$file2>) {
  $items{$_}++;
}

%items値が 2 のキーは両方のファイルにあります。値が 1 のキーは、1 つのファイルにのみ存在します。

各値がどのファイルに表示されるかを知る必要がある場合は、ファイルごとに異なる番号を追加することで一般化できます。たとえば、最初のファイルの行に 100、2 番目のファイルの行に 10、3 番目のファイルの行に 1 を追加すると、値 101 のキーが最初のファイルの行を表していることがすぐにわかります。および 3 番目のファイルですが、2 番目のファイルにはありません。

于 2013-04-02T05:51:44.040 に答える