Pregunta sobre arrays, loops, perl – ¿Cómo puedo comparar diferentes elementos de matriz en Perl?

1

Soy nuevo en este campo. Así que amablemente vaya fácil en mí. Tengo dos matrices:

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

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

Quiero comparar los elementos de estas dos matrices diferentes. Pero, solo quiero unir letras con letras. Así, por ejemplo, si se comparan matrices,$array[2] El elemento (PLE) debe coincidir con$array2[0] (PLE) y similarmente$array1[0] (ABC) debe coincidir con$array[1] (A B C). Puedo hacerlo uno a la vez pero no puedo comparar todos los elementos de ambos arreglos al mismo tiempo (es decir, hacer un bucle de los arreglos).

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

¿Alguna sugerencia sobre cómo configurar el bucle para ambas matrices al mismo tiempo?

@ Birdy: No creo que no quieras el mismo mensaje cada vez que obtienes una coincidencia, ya que no te dice mucho. Es decir, al obtener coincidencias, vería una y otra vez "longitud", (siguiente coincidencia) "longitud", (siguiente coincidencia) "longitud", pero no sabría qué elementos coincidían. Si miras todas las soluciones, una cosa que tienen en común es que los mensajes intentan decirle al usuario algo sobre lo que coincide con qué. Telemachus
¿Qué es exactamente lo que quieres de laprint " length \n"; declaración al final? ¿Quieres imprimir la longitud de la palabra o usar la función de longitud en algo? Telemachus
@Telemachus: la idea es no imprimir la longitud. Eso es cualquier palabra que haya escrito para imprimir si se cumple la condición (coinciden las letras de diferentes elementos en dos matrices). Solo quiero comparar todos los elementos de la matriz y almacenar / dar salida a los que coinciden con las letras (por ejemplo, ABC, PBL). birdy

Tu respuesta

2   la respuesta
2

rimero (debería tomar O (n lg (n)), luego compararlas con dos iteradores en tiempo lineal. Si el rendimiento no es un problema, manténgalo simple y vaya con un número cuadrático comparaciones por pares. Mientras clasifica, también puede deshacerse de los dígitos al final.

4

Puede utilizar un hash como dispositivo de búsqueda y obtener unO(m+n) solución (dondem es la longitud de array1 yn es la longitud 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";
    }
}

Preguntas relacionadas