Сравнение двух списков в Perl - PullRequest
0 голосов
/ 14 октября 2019

У меня есть два набора файлов.

Пример 1: имена файлов нумеруются, однако некоторые файлы могут отсутствовать.

Пример 1:

Набор A:1.txt 2.txt 3.txt 5.txt 6.txt 7.txt 8.txt

Набор B: 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7. txt 8.txt

Примечание. 4.txt отсутствует в наборе A.

Я хочу сравнить два списка.

Если я найду совпадение (т.е. 1.txt равно 1.txt), я хочу использовать эти два файла вместе.

Когда имена файлов не совпадают (т.е. 5.txtи 4.txt), я хочу использовать только 4.txt из набора B.

Продолжая, я хочу сопоставить следующий набор (т. е. 5.txt и 5.txt, 6.txt и 6. txt и т. д.).

Пример 2: Могут также быть случаи, когда списки файлов выглядят следующим образом:

Пример 2:

Набор A: 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt

Набор B: 1.txt 2.txt 4.txt 6.txt 8.txt

Примечание: 3.txt и 5.txt отсутствуют в наборе B.

Если я найду совпадение (то есть 1.txt равняется 1.txt, 2.txt равняется 2.txt), я хочу использовать эти два файла,вместе.

Если имена файлов не совпадают (например, 3.txt и 4.txt), я хочу использовать только 3.txt из набора A.

Продолжая, я хочусоответствовать следующему набору (например, 4.txt и 4.txt).

Когда имена файлов не совпадают (например, 5.txt и 6.txt), я хочу использовать только 5.txt из набора A.

Продолжение on, я хочу сопоставить следующий набор (т.е. 6.txt и 6.txt и т. д.) и т. д. и т. п.

Итак, гипотетически, результаты (для примера 2) должны выглядеть следующим образом:

Набор A: 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt N / A

Набор B: 1.txt 2.txt N /A 4.txt N / A 6.txt N / A 8.txt

Пример 3: Могут также быть случаи, когда в обоих списках отсутствуют файлы следующим образом:

Пример 3:

Набор A: 2.txt 3.txt 4.txt 5.txt 7.txt

Набор B: 1.txt 2.txt 6.txt 8.txt

Примечание: 1.txt, 6.txt и 8.txt отсутствуют в наборе A -AND- 4.txt, 5.txt и 7.txt отсутствуют в наборе B.

Я загрузил2 списка в 2 отдельных массива, чтобы сделать сравнение без удачи.

Я также слил 2 массива в 1 массив, но я не смог получить результаты, к которым я стремлюсь.

Итак, без написания чрезмерного количества кода (т.е. многочисленных)если «заявления», мне было интересно, есть ли более простой способ достичь этого в Perl.

Заранее спасибо.

1 Ответ

2 голосов
/ 14 октября 2019

Вот пример того, как вы могли бы перебрать два набора (если я правильно понял вопрос):

use strict;
use warnings;
use List::Util qw(uniq);

my @setA = qw(1.txt 2.txt 3.txt 5.txt 6.txt 7.txt 8.txt);
my @setB = qw(1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt);

my @all_keys = sort {$a cmp $b} uniq @setA, @setB;
my %setA = map {$_ => 1} @setA;
my %setB = map {$_ => 1} @setB;

for my $key (@all_keys) {
    if (exists $setA{$key} && exists $setB{$key}) {
        # use both $setA{$key} and $setB{$key}
    }
    elsif (exists $setA{$key}) {

    }
    elsif (exists $setB{$key}) {

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