• Publicidad

Comparar arrays

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Comparar arrays

Notapor sisifo80 » 2016-09-26 08:34 @398

Tengo dos carpetas con archivos. La carpeta 1 contiene archivos con extensión TXT; La segunda contiene archivos con extensión XML. Necesitaba saber qué nombres de ficheros, obviando la extensión, están en la carpeta 1 y no están en la carpeta 2. He logrado hacer un script para conseguir esto, que es el que copio a continuación:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. opendir IN, 'carpeta1';
  2. my @array1 = grep { /^[^.]/ } readdir IN;
  3. closedir IN;
  4.  
  5. opendir IN, 'carpeta2';
  6. my @array2 = grep { /^[^.]/ } readdir IN;
  7. closedir IN;
  8.  
  9. for (@array1) {
  10.    s/\.txt//;
  11. }
  12.  
  13. for (@array2) {
  14.    s/\.xml//;
  15. }
  16.  
  17.  
  18. my %array2_elements;
  19. @array2_elements{ @array2 } = ();
  20. my @array3 = grep ! exists $array2_elements{$_}, @array1;
  21.  
  22. foreach (@array3) {print "$_\n";};
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Sin embargo, las últimas líneas del script no son cosa mía. Simplemente copié y adapté un código que encontré en Internet para comparar arrays. Me gustaría entenderlo bien para saber usarlo y/o adaptarlo a otras necesidades en el futuro.

¿Alguien me podría explicar literalmente lo que quieren decir las líneas 18, 19 y 20 del código anterior? Soy consciente de que debo aprender a usar hashes en Perl.

Gracias.
sisifo80
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-20 07:30 @354

Publicidad

Re: Comparar arrays

Notapor explorer » 2016-09-26 17:38 @776

Línea 18: se declara un hash llamado %array2_elements.

Línea 19: se inicializa el contenido de %arra2_elements, usando los elementos de @arrays como claves, y... el valor indefinido como valores correspondientes a esas claves. Esa línea es equivalente a estas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $e (@array2) {
  2.     $array2_elements{ $e } = undef;
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo que estamos haciendo, es crear un hash cuyas claves son los mismos elementos que los que contiene @array2.

Línea 20: Se recorren los elementos de @array1. Por cada uno de ellos, vemos a ver si existe o no ese elemento como clave de %array2_elements. Si no existe, lo almacenamos en @array3. Escrito de otra manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $e (@array1) {
  2.     if ( ! exists $array2_elements{ $e } ) {            # si el elemento que estaba en @array1 no existe como clave de %array2_elements,
  3.         push @array3, $e;                               # lo almacenamos en @array3
  4.     }
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El efecto neto es que en @array3 quedan los elementos de @array1 que no están en @array2. Vamos, que hemos hecho una "diferencia" entre conjuntos :)

Tienes más soluciones a preguntas sobre arrays en perldoc -q array, en tu propio ordenador.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar arrays

Notapor sisifo80 » 2016-09-27 02:16 @136

Muchas gracias por tu explicación, explorer. Era justo lo que pedía. Me quedó claro.
sisifo80
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-11-20 07:30 @354


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron