Pytanie w sprawie perl, loops, arrays – Jak mogę porównać różne elementy tablicy w Perlu?

1

Jestem nowy w tej dziedzinie. Tak uprzejmie idź na mnie. Mam dwie tablice:

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

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

Chcę porównać elementy tych dwóch różnych tablic. Ale chcę dopasować tylko litery z literami. Na przykład, jeśli tablice są porównywane,$array[2] element (PLE) powinien pasować do$array2[0] (PLE) i podobnie$array1[0] (ABC) powinien pasować do$array[1] (ABC). Jestem w stanie to zrobić pojedynczo, ale nie jestem w stanie porównać wszystkich elementów obu tablic w tym samym czasie (czyli pętli tablic).

    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";
    }

Jakieś sugestie dotyczące konfiguracji pętli dla obu macierzy jednocześnie?

@ Birdy: Nie sądzę, żebyś nie chciał tej samej wiadomości za każdym razem, gdy dostaniesz zapałkę, ponieważ niewiele ci to mówi. Oznacza to, że w miarę otrzymywania dopasowań można by zobaczyć „długość”, (następne dopasowanie) „długość”, (następne dopasowanie) „długość”, ale nie wiadomo, które elementy pasowały. Jeśli spojrzysz na wszystkie rozwiązania, jedną rzeczą wspólną jest to, że wiadomości próbują powiedzieć użytkownikowi coś o tym, co pasuje do tego. Telemachus
@ Telemachus: Pomysł nie polega na drukowaniu długości. To jest po prostu każde słowo, które napisałem, aby wydrukować, jeśli warunek jest spełniony (litery z różnych elementów w dwóch tablicach pasują). Chcę tylko porównać wszystkie elementy tablicy i zapisać / wydrukować te, w których pasują litery (np. ABC, PBL). birdy
Czego dokładnie chcesz odprint " length \n"; oświadczenie na końcu? Czy chcesz wydrukować długość słowa lub użyć funkcji długości na czymś? Telemachus

Twoja odpowiedź

2   odpowiedź
4

Możesz użyć skrótu jako urządzenia wyszukiwania i uzyskaćO(m+n) rozwiązanie (gdziem to długość tablicy1 in jest długością tablicy2).

#!/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

inno zabrać Cię O (n lg (n)), a następnie porównać je z dwoma iteratorami w czasie liniowym.Jeśli wydajność nie jest problemem, po prostu zachowaj prostotę i przejdź z kwadratową liczbą porównania parami Podczas sortowania można również pozbyć się cyfr na końcu.

Powiązane pytania