0

可能重复:
使用 Perl 比较两个数组

我正在尝试查找两个文件中共有的元素:下面是我的代码。请告诉我我在做什么错误。

open IN,  "New_CLDB.txt"     or die "couldn't locate input file";
open IN1, "New_adherent.txt" or die "couldn't locate input file";
use Data::Dumper;
@array = ();
while (<IN>) {
    $line = $_;
    chomp $line;
    $a[$i] = $line;
    ++$i;
}
while (<IN1>) {
    $line1 = $_;
    chomp $line1;
    $b[$m] = $line1;
    ++$m;
}
for ( $k = 0; $k < $i; ++$k ) {
    for ( $f = 0; $f < $m; ++$f ) {
        if ( $a[$k] ne $b[$f] ) {
            push( @array, $a[$k] );
        }
    }
}
print @array, "\n";
4

3 回答 3

6

请告诉我我在做什么错误。

从表面上看你的代码,这里有一个列表:

  • 不使用strict编译指示
  • 没有你想要达到的精确规格
  • 试图一次做太多事情

远离代码一步,用简单的英语思考它。你需要做什么?

  • 读取文件 - 打开、读取、关闭
  • 将文件数据读入数组 - 究竟如何?
  • 使用函数不要重复文件 A 和文件 B
  • 比较数组

单独执行每项任务,始终使用strict. 总是。只有这样,才能将单个步骤组合成更大的脚本。

你也可以看看这个其他 SO question

于 2012-04-10T21:42:46.893 回答
3

如果第二组中没有重复项:

my %set1;
while (<$fh1>) {
   chomp;
   ++$set1{$_};
}

while (<$fh2>) {
   chomp;
   print("$_ is common to both sets\n")
      if $set1{$_};
}

如果第二组中可能有重复项:

my %set1;
while (<$fh1>) {
   chomp;
   ++$set1{$_};
}

my %set2;
while (<$fh2>) {
   chomp;
   print("$_ is common to both sets\n")
      if $set1{$_} && !$set2{$_}++;
}
于 2012-04-10T22:53:46.283 回答
1

有几点需要改进:

  1. 总是use strict;use warnings;
  2. 使用三参数版本open
  3. 使用词法文件句柄
  4. 使用有意义的格式/缩进
  5. 附加一个数组push @array, $value;

对于 SO 问题......你的问题到底是什么,你期望什么。

于 2012-04-10T21:46:26.637 回答