• Publicidad

Función para borrar repetidos

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

Función para borrar repetidos

Notapor BigBear » 2017-03-27 20:34 @899

Hola, tengo esta función:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @array1 = ("test","test","test");
  2. my @array2 = ("test","test","test");
  3.  
  4. my @array1_cleaned = repes(@array1);
  5. my @array2_cleaned = repes(@array2);
  6.  
  7. for(@array1_cleaned) {
  8.         print $_."\n";
  9. }
  10. print "\n";
  11. for(@array2_cleaned) {
  12.         print $_."\n";
  13. }
  14.  
  15. sub repes {
  16.     my @array_to_clean = @_;
  17.     my @array_cleaned;
  18.     foreach $text ( @array_to_clean ) {
  19.         push @array_cleaned, $text if not $wtf{$text}++;
  20.     }
  21.     return @array_cleaned;
  22. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Sirve para borrar repetidos en dos arrays varias veces usando una función, el problema es que nunca funciona bien dos veces seguidas, no sé por qué, el resultado es solo "test" que indica que solo limpio el primer array. Debería devolver dos "test".

¿ Cuál es el problema ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Función para borrar repetidos

Notapor explorer » 2017-03-28 02:43 @155

La variable %wtf no se inicializa entre ejecuciones de la subrutina, por lo que va acumulando lo que ve. El segundo "test" no se ve en la segunda ejecución porque ya lo tiene "almacenado" de la primera ejecución. La solución es insertar un my %wtf; antes del bucle.

Este tipo de cosas te las avisaría el propio Perl si hubieras puesto use strict; use warnings; al principio del programa, algo muy útil en la fase de desarrollo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my @array1 = qw(test test test);
  5. my @array2 = qw(test test test);
  6.  
  7. my @array1_cleaned = repes(@array1);
  8. my @array2_cleaned = repes(@array2);
  9.  
  10. say for @array1_cleaned;
  11. print "\n";
  12. say for @array2_cleaned;
  13.  
  14. sub repes {
  15.     my @array_to_clean = @_;
  16.     my @array_cleaned;
  17.  
  18.     my %wtf;
  19.     for my $text (@array_to_clean) {
  20.         push @array_cleaned, $text if not $wtf{$text}++;
  21.     }
  22.  
  23.     return @array_cleaned;
  24. }
  25.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Función para borrar repetidos

Notapor BigBear » 2017-03-28 16:09 @715

Ok, gracias por la ayuda, explorer.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados

cron