• Publicidad

Imprimir líneas duplicadas una vez

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

Imprimir líneas duplicadas una vez

Notapor newperlero » 2011-08-11 02:07 @129

Hola,

Tengo un fichero por una parte, que contiene líneas así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
línea1
línea1
línea2
línea4
línea3
línea6
línea6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y estaba intentando imprimir por pantalla todas las líneas, y si la línea está repetida imprimirla, pero solo una vez.

El código que tengo me funciona, hasta las últimas líneas, que sí que me imprime línea6 dos veces.
¿Sabéis por qué puede ser?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open FILE, q[<], 'file.txt' or die "$!";
  2. my @fichero=<FILE>;
  3. close FILE;
  4.  
  5. my @unicas = grep { ! $vista{$_} ++ } @fichero;
  6. print @unicas;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
newperlero
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2011-07-15 06:38 @318

Publicidad

Re: Imprimir líneas duplicadas una vez

Notapor explorer » 2011-08-11 06:16 @303

Pues porque las dos últimas líneas son distintas... hay un carácter de diferencia.

¿Lo ves? :wink:

Cambia la última línea del programa por esta, para poder verlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "[", join("][", @unicas), "]\n";
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: Imprimir líneas duplicadas una vez

Notapor newperlero » 2011-08-11 06:39 @319

explorer escribiste:Pues porque las dos últimas líneas son distintas... hay un carácter de diferencia.

¿Lo ves? :wink:


Touché :wink: . Ni me había dado cuenta.
He intentado hacer un chomp() a todas las líneas, modificando estas líneas, quedando así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @unique = grep { ! $seen{chomp($_)} ++ } @fichero;
  2. print @unique;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero la salida se convierte en esto, no lo entiendo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
línea1línea6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Para solucionar esto, solo se me ocurren "charcuterias" que afean el código un montón :?
¿Se podría arreglar esto de forma elegante sin tener que modificar mucho el código? Con lo bien que estaba quedando... >.<
newperlero
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2011-07-15 06:38 @318

Re: Imprimir líneas duplicadas una vez

Notapor explorer » 2011-08-11 08:05 @378

Es que no es lo mismo

print @unique;

que

print "@unique";

En el primer caso, se sacan los valores del array @unique todos juntos, porque le estamos pidiendo que saque los valores de @unique, tal cual. En cambio, en el segundo caso, con las comillas dobles estamos solicitando una conversión a cadenas de caracteres de un array que, por defecto, es sacar todos los elementos de un array, unidos por el valor contenido en la variable especial $". En otras palabras,

print "@unique";

es lo mismo que

print join($", @unique);

Por defecto, $" es un espacio en blanco.

Todo depende de lo que quieras hacer y de cómo quieras mostrarlo. Fíjate en la última propuesta que te he puesto en el mensaje mío anterior, con la solución del join().

Otra forma de hacerlo, más limpia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $" = '][';
  2. print "[@unicas]\n";
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: Imprimir líneas duplicadas una vez

Notapor newperlero » 2011-08-11 10:44 @489

Perfecto, con lo que me has explicado ya he conseguido hacerlo funcionar.
¡gracias!
newperlero
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2011-07-15 06:38 @318


Volver a Básico

¿Quién está conectado?

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