Вопрос по arrays, perl – Как я могу сравнить различные элементы массива в Perl?

1

Я новичок в этой области. Так что будь добр ко мне. У меня есть два массива:

@array1 = ("ABC321", "CDB672", "PLE89",....);

@array2 = ("PLE89", "ABC678", "LMD789",...);

Я хочу сравнить элементы этих двух разных массивов. Но я хочу сопоставлять буквы только с буквами. Так, например, если сравниваются массивы,$array[2] элемент (PLE) должен совпадать с$array2[0] (PLE) и аналогично$array1[0] (ABC) должен совпадать с$array[1] (АВС). Я могу сделать это по одному, но не могу сравнить все элементы обоих массивов одновременно (то есть зацикливание массивов).

    my ($value1)= ($array[2]=~ /([A-Z]+)[0-9]+/);
    print "Value1: $value1 \n";
    my ($value2)= ($array[0]=~ /([A-Z]+)[0-9]+/);
    print "Value2 : $value2 \n";
    if ($value1 eq $value2){
            print " length \n";
    }

Любые предложения о том, как настроить цикл для обоих массивов одновременно?

@Telemachus: идея не в том, чтобы напечатать длину. Это просто любое слово, которое я написал для печати, если выполняется условие (буквы из разных элементов в двух массивах совпадают). Я только хочу сравнить все элементы массива и сохранить / вывести те, в которых совпадают буквы (например, ABC, PBL). birdy
@ Берди: Я не думаю, что вы не хотите получать одно и то же сообщение каждый раз, когда получаете совпадение, так как оно мало что вам говорит. То есть, когда вы получаете совпадения, вы будете видеть снова и снова & quot; длина & quot ;, (следующий матч) & quot; длина & quot ;, (следующий матч) & quot; длина & quot ;, но вы не знаете, какие элементы совпадают. Если вы посмотрите на все решения, их объединяет то, что сообщения пытаются рассказать пользователю о том, что и что соответствует. Telemachus
Что именно вы хотите отprint " length \n"; заявление в конце? Вы хотите напечатать длину слова или использовать функцию длины на чем-то? Telemachus

Ваш Ответ

2   ответа
4

O(m+n) решение (гдеm длина массива1 иn это длина массива2).

#!/usr/bin/perl

use strict;
use warnings;

my @array1 = qw(ABC321 CDB672 PLE89);
my @array2 = qw(PLE89  ABC678 LMD789);

my %seen;

for my $item (@array1) {
    die "not a valid item: $item"
        unless my ($key) = $item =~ /([A-Z]+)/;

    #we are using an array to hold the items in case
    #the same key shows up more than once in an array
    #this code can be simpler if you can guarantee 
    #that the keys are unique
    push @{$seen{$key}}, $item;
}

for my $item (@array2) {
    die "not a valid item: $item"
        unless my ($key) = $item =~ /([A-Z]+)/;
    if (exists $seen{$key}) {
        print "$item is in array1, it matches @{$seen{$key}}\n";
    } else {
        print "$item is not in array1\n";
    }
}
2

ссива (нужно взять O (n lg (n)), а затем сравнить с двумя итераторами за линейное время. Если производительность не является проблемой, просто сделайте это простым и используйте квадратичное число парных сравнений. При сортировке вы также можете избавиться от цифр в конце.

Похожие вопросы