Pergunta sobre loops, arrays, perl – Como posso comparar diferentes elementos de matriz em Perl?

1

Eu sou novo neste campo. Então, gentilmente, seja fácil comigo. Eu tenho dois arrays:

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

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

Eu quero comparar elementos desses dois arrays diferentes. Mas quero combinar apenas letras com letras. Então, por exemplo, se as matrizes são comparadas,$array[2] elemento (PLE) deve combinar com$array2[0] (PLE) e similarmente$array1[0] (ABC) deve combinar com$array[1] (ABC). Eu sou capaz de fazer um no tempo, mas não é capaz de comparar todos os elementos de ambos os array ao mesmo tempo (que é o loop dos arrays).

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

Alguma sugestão sobre como configurar um loop para as duas matrizes ao mesmo tempo?

O que exatamente você quer doprint " length \n"; declaração no final? Você quer imprimir o comprimento da palavra ou usar a função de comprimento em algo? Telemachus
@Telemachus: A idéia não é imprimir o comprimento. Isso é apenas qualquer palavra que escrevi para imprimir se a condição for satisfeita (letras de elementos diferentes em duas matrizes coincidem). Eu só quero comparar todos os elementos de matriz e armazenar / saída aqueles em que letras (por exemplo, ABC, PBL) correspondem. birdy
@ Birdy: Eu não acho que você não queira a mesma mensagem toda vez que fizer uma partida, já que não lhe diz muito. Ou seja, à medida que você recebe correspondências, você veria mais e mais "duração", (próxima correspondência) "duração", (próxima correspondência) "duração", mas você não saberia quais itens estavam correspondendo. Se você observar todas as soluções, uma coisa que elas têm em comum é que as mensagens tentam dizer ao usuário algo sobre o que corresponde ao que. Telemachus

Sua resposta

2   a resposta
4

Você pode usar um hash como um dispositivo de pesquisa e obterO(m+n) solução (ondem é o comprimento de array1 en é o comprimento de 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";
    }
}
2

imeiro (deveria levá-lo O (n lg (n)), então comparar com dois iteradores em tempo linear.Se o desempenho não é um problema, mantenha-o simples e vá com um número quadrático de comparações por pares Enquanto você classifica, você também pode se livrar de dígitos no final.

Perguntas relacionadas