2

我想比较从我编写的 perl 脚本之一生成的两个文本文件。我想从这两个文本文件中打印出匹配的结果。我尝试查看人们在 stackoverflow 上提出的几个答案和问题,但它对我不起作用。这是我尝试过的。

my $file1 = "Scan1.txt";
my $file2 = "Scan2.txt";
my $OUTPUT = "final_result.txt";
my %results = (); 
open FILE1, "$file1" or die "Could not open $file1 \n";
   while(my $matchLine = <FILE1>)
       {   
         $results{$matchLine} = 1;
    }
    close(FILE1); 
    open FILE2, "$file2" or die "Could not open $file2 \n";
   while(my $matchLine =<FILE2>) 
        {  
    $results{$matchLine}++;
        }
    close(FILE2);  
    open (OUTPUT, ">$OUTPUT") or die "Cannot open $OUTPUT \n";
    foreach my $matchLine (keys %results) { 
    print OUTPUT $matchLine if $results{$matchLine} ne 1;
    }
    close OUTPUT;

我想要的输出示例

FILE1.TXT 数据1 数据2 数据3

FILE2.TXT 数据2 数据1

输出数据 1 数据 2

4

1 回答 1

1

您的问题是您的哈希现在具有以下状态:

  • 0(在任何地方都找不到行),
  • 1(在 file1 中找到的行或在 file2 中找到的行),
  • 2(在 file1 中找到的行,在 file2 中找到一次,或在 file2 中找到两次)
  • n(在 file1 中找到的行和在 file2 中的 n-1 次,或在 file2 中找到 n 次的行)

这种歧义将使您的检查(哈希 ne 1)失败。

您的算法所需的最小更改是:

my $file1 = "Scan1.txt";
my $file2 = "Scan2.txt";
my $OUTPUT = "final_result.txt";
my %results = (); 
open FILE1, "$file1" or die "Could not open $file1 \n";
   while(my $matchLine = <FILE1>)
       {   
         $results{$matchLine} = 1;
    }
    close(FILE1); 
    open FILE2, "$file2" or die "Could not open $file2 \n";
   while(my $matchLine =<FILE2>) 
        {  
    $results{$matchLine} = 2 if $results{$matchLine}; #Only when already found in file1
        }
    close(FILE2);  
    open (OUTPUT, ">$OUTPUT") or die "Cannot open $OUTPUT \n";
    foreach my $matchLine (keys %results) { 
    print OUTPUT $matchLine if $results{$matchLine} ne 1;
    }
    close OUTPUT;
于 2012-05-23T17:01:38.470 回答