Frage an perl, arrays, loops – Wie kann ich verschiedene Elemente eines Arrays in Perl vergleichen?

1

Ich bin neu in diesem Bereich. Also mach es mir bitte leicht. Ich habe zwei Arrays:

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

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

Ich möchte Elemente dieser beiden verschiedenen Arrays vergleichen. Aber ich möchte nur Buchstaben mit Buchstaben abgleichen. Wenn also beispielsweise Arrays verglichen werden,$array[2] Element (PLE) sollte mit übereinstimmen$array2[0] (PLE) und ähnlich$array1[0] (ABC) sollte mit übereinstimmen$array[1] (ABC). Ich kann es einzeln ausführen, aber nicht alle Elemente beider Arrays gleichzeitig vergleichen (dh die Arrays werden in einer Schleife ausgeführt).

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

Irgendwelche Vorschläge, wie ich die Schleife für beide Arrays gleichzeitig einrichten kann?

@ Birdy: Ich glaube nicht, dass Sie jedes Mal, wenn Sie eine Übereinstimmung erhalten, dieselbe Nachricht erhalten möchten, da sie Ihnen nicht viel sagt. Das heißt, wenn Sie Übereinstimmungen erhalten, würden Sie immer wieder "Länge", (nächste Übereinstimmung) "Länge", (nächste Übereinstimmung) "Länge" sehen, aber Sie würden nicht wissen, welche Elemente übereinstimmen. Wenn Sie sich alle Lösungen ansehen, haben sie gemeinsam, dass die Nachrichten versuchen, dem Benutzer etwas darüber zu sagen, was mit was übereinstimmt. Telemachus
Was genau willst du von derprint " length \n"; Aussage am Ende? Möchten Sie die Wortlänge drucken oder die Längenfunktion für etwas verwenden? Telemachus
@Telemachus: Die Idee ist nicht, die Länge zu drucken. Dies ist nur ein Wort, das ich zum Drucken geschrieben habe, wenn die Bedingung erfüllt ist (Buchstaben aus verschiedenen Elementen in zwei Arrays stimmen überein). Ich möchte nur alle Elemente eines Arrays vergleichen und diejenigen speichern / ausgeben, in denen Buchstaben (zB ABC, PBL) übereinstimmen. birdy

Deine Antwort

2   die antwort
2

zuerst beide Arrays zu sortieren (sollten Sie O (n lg (n)) nehmen) und dann mit zwei Iteratoren in linearer Zeit vergleichen paarweise Vergleiche: Beim Sortieren können Sie am Ende auch die Ziffern loswerden.

4

O(m+n) Lösung (wom ist die Länge von array1 undn ist die Länge von array2).

#!/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";
    }
}

Verwandte Fragen