打印文档A中存在但在文档B中不存在的数字

时间:2011-03-08 08:22:29

标签: perl

我在编写Perl程序以匹配两个文档中的数字时遇到问题。假设有文件A和B。

所以我想得到文件A中的数字,而文件B中没有。

示例1:

DocA:1 2 3 5 6 8 9 10 11 12 13

DocB:1 2 3 6 7 8 9 10 11

输出:

5 12 13

编辑:

@a=qw( 1 2 3 5 6  8 9 10 11 12 13);
@b=qw( 1 2 3 4 5 6 7 8 9 10 11);
@new=();
@new1=();
for($i=0;$i<=$#a;$i++)
{
  for($j=0;$j<=$#b;$j++)
  {
    if($a[$i] ne $b[$j])
    {
      push(@new,$b[$j]);
    }
  }
}

4 个答案:

答案 0 :(得分:0)

考虑Algorithm::Diff

答案 1 :(得分:0)

你可以使用哈希。读取DocA并使用读取的数字作为键初始化哈希:

open(INPUT, "DocA");
while (<INPUT>)
{
   chomp;
   $myhash{$_} = 1;
}

然后阅读DocB和foreach编号,检查是否已在哈希中定义:

open(INPUT, "DocB");
while (<INPUT>)
{
   chomp;
   if (not defined $myhash{$_})
   {
      print "$_\n";
   }
}
  • 此代码假设您每行都有一个数字。如果您的文件格式不同,则需要对其进行调整。
  • 即使您的号码未订购,此代码仍然有效。

答案 2 :(得分:0)

您可以使用CPAN模块Array :: Utils。以下将满足您的需求:

use Array::Utils qw(:all);

my @a = qw( 1 2 3 5 6 8 9 10 11 12 13);
my @b = qw( 1 2 3 4 5 6 7 8 9 10 11);

my @diff = array_minus(@a, @b);`

顺便说一句,你的程序不起作用的原因是你犯了一个逻辑错误。您正在为@new EVERY TIME添加一个值,该值不匹配。因此,在循环的第一次迭代中,您将a值与b值进行比较。即使该值等于@b的第一个元素,它也不等于@b的其他十个元素,因此所有这些元素都被添加到@new中。我重写了你的循环。请注意Perlish循环,而不是您在代码中使用的C循环。

my @a = qw( 1 2 3 5 6 8 9 10 11 12 13);
my @b = qw( 1 2 3 4 6 7 8 9 10 11);
my @new = ();

for my $a_value (@a) {
    my $b_not_in_a = 1;
    INNER: for my $b_value (@b)
    {   if($a_value == $b_value)    {
        $b_not_in_a = 0;
        last INNER;     }
    }

    if ($b_not_in_a)
    {
        push(@new,$a_value);

    }
}

答案 3 :(得分:0)

示例中的列表已排序。我假设他们是,并且你不允许使用模块,因为它是功课。此外,由于它是家庭作业,我不会给出答案,但有一些提示正确的方向。

如果你手工做,只允许你看每行的前面,你会怎么做?如果A的头部是比B小的数字,那是什么意思?如果它是平等的,那意味着什么?如果它更大,那意味着什么?

现在您知道如何处理一种情况,您可以创建某种步骤来减少问题。现在定义何时需要停止,以及列表中可能剩余的剩余部分,以及如何从步骤中收集的值和停止后的余数中获得答案。

极端情况的一些例子:

@a = qw();
@b = qw(1 2 3);

@a = qw (1 2 3);
@b = qw (4 5 6);

@a = qw(1  3  5);
@b = qw(2 4 6)
祝你好运!