напечатать номер, который присутствует в документе A, но отсутствует в документе B - PullRequest
0 голосов
/ 08 марта 2011

У меня проблема с созданием Perl-программы для сопоставления чисел в двух документах. Допустим, есть документы A и B.

Итак, я хочу иметь номера, которые присутствуют в документе A и отсутствуют в документе B.

Пример 1:

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

ДокБ: 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 голосов
/ 08 марта 2011

Списки в вашем примере отсортированы.Я предполагаю, что они есть, и что вы не можете использовать модули, так как это домашняя работа.Кроме того, так как это домашнее задание, я не буду давать ответ, но некоторые намеки в правильном направлении.

Если вы сделаете это вручную, и вам разрешено смотреть только на переднюю часть каждого рядакак бы ты это сделал?Если заголовок 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)

Удачи!

0 голосов
/ 08 марта 2011

Вы можете использовать хеш.Прочитайте DocA и инициализируйте хэш, используя в качестве ключей считанные числа:

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

Затем прочитайте DocB и номер foreach, проверьте, уже определено ли в вашем хеше:

open(INPUT, "DocB");
while (<INPUT>)
{
   chomp;
   if (not defined $myhash{$_})
   {
      print "$_\n";
   }
}
  • ThisКод предполагает, у вас есть номер в строке.Если ваши файлы отформатированы по-другому, вам нужно будет их адаптировать.
  • Этот код будет работать, даже если ваши номера не упорядочены.
0 голосов
/ 08 марта 2011

Вы можете использовать модуль 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 КАЖДЫЙ РАЗ, значение которого не совпадает. Итак, на первой итерации цикла вы сравниваете значение 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);

    }
}
0 голосов
/ 08 марта 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...