我在编写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]);
}
}
}
答案 0 :(得分:0)
答案 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)
祝你好运!