• Publicidad

Sólo los elementos repetidos

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

Sólo los elementos repetidos

Notapor jmdelcampo » 2006-11-24 07:51 @368

Hola,

Soy nuevo en esto. Querría a partir de un array obtener aquellos elementos que están repetidos mediante la función grep. He intentado algo, pero no logro obtener resultados
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@arreglo = (1,3,5,7,3,2,1,8,3,7,3,5,1);
@coinc=grep(/$_{3,}/ , @arreglo);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Gracias por anticipado a vuestras respuestas
jmdelcampo
jmdelcampo
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2006-11-24 07:43 @363

Publicidad

Notapor explorer » 2006-11-24 08:36 @400

Bienvenido a los foros de Perl en Español.

El grep selecciona los elementos que coincidan con el patrón indicado.

Estás diciendo en tu programa que grep debe quedarse con los elementos que estén compuestos de 3 o más repeticiones: 111, 333333, 55555555555555, 222, etc., etc.

Esto suele ser un trabajo de un hash.
Mira en http://perldoc.perl.org/perlfaq4.html#H ... r-array%3f como se eliminan los duplicados.
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

Notapor jmdelcampo » 2006-11-24 08:47 @408

Gracias explorer,

Creo que he expresado mal el objetivo de mi consulta. Lo que realmente quiero hacer es un programa que extraiga de un array todos aquellos elementos que aparezcan más de una vez y los coloque en otro array empleando la función grep, de ahí el código especificado en el post anterior

Gracias por adelantado
jmdelcampo
jmdelcampo
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2006-11-24 07:43 @363

Notapor kidd » 2006-11-24 10:07 @463

En el link que te dio explorer viene la respuesta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   my %seen = ();
   my @unique = grep { ! $seen{ $_ }++ } @array;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor jmdelcampo » 2006-11-27 07:35 @358

Muchas gracias por la respuesta

Saludos
Jmdelcampo
jmdelcampo
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2006-11-24 07:43 @363

Re:

Notapor sufisavey80 » 2012-11-07 18:30 @812

explorer escribiste:Bienvenido a los foros de Perl en Español.

El grep selecciona los elementos que coincidan con el patrón indicado.

Estás diciendo en tu programa que grep debe quedarse con los elementos que estén compuestos de 3 o más repeticiones: 111, 333333, 55555555555555, 222, etc., etc.

Esto suele ser un trabajo de un hash.
Mira en http://perldoc.perl.org/perlfaq4.html#H ... r-array%3f como se eliminan los duplicados.



¿Qué tal...?

Voy empezando en este mundo de Perl y me doy cuenta de que en este foro tiene respuestas a muchos casos... espero me puedan ayudar, mi caso es que tengo un fichero de entrada:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Fixed Amortizing Bond,91,PLANRIO,05U,UDI,62.83,174384,20050505,20200331,76.75232957,91,DIAS,7,   91DAY,360,,,,1,CYPM,Backward,20191223,,,Regular,0,0,,PBG_V_Rva,Renta Fija, ,True,Directo,,BNORTEP,Vencimiento,0,,
Fixed Amortizing Bond,91,PLANRIO,05U,UDI,62.83,174384,20050505,20200331,76.75232957,91,DIAS,7,   91DAY,360,,,,1,CYPM,Backward,20191223,,,Regular,0,0,,PBG_V_Rva,Renta Fija, ,True,Directo,,BNORTEP,Vencimiento,0,,
Fixed Amortizing Bond,91,PLANRIO,05U,UDI,62.83,174384,20050505,20200331,76.75232957,91,DIAS,7,   91DAY,360,,,,1,CYPM,Backward,20191223,,,Regular,0,0,,PBG_V_Rva,Renta Fija, ,True,Directo,,BNORTEP,Vencimiento,0,,
Fixed Amortizing Bond,91,PLANRIO,05U,UDI,62.83,174384,20050505,20200331,76.75232957,91,DIAS,7,   91DAY,360,,,,1,CYPM,Backward,20191223,,,Regular,0,0,,PBG_V_Rva,Renta Fija, ,True,Directo,,BNORTEP,Vencimiento,0,,
Fixed Amortizing Bond,91,PLANRIO,05U,UDI,62.83,174384,20050505,20200331,76.75232957,91,DIAS,7,   91DAY,360,,,,1,CYPM,Backward,20191223,,,Regular,0,0,,PBG_V_Rva,Renta Fija, ,True,Directo,,BNORTEP,Vencimiento,0,,
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

en el cual las cinco líneas son iguales y lo que deseo es que solo me quede una sola línea de datos de estas cinco, y así para todos los demás casos que se repitan, solo dejar un solo dato... Muchas gracias.
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Sólo los elementos repetidos

Notapor explorer » 2012-11-07 19:29 @853

Bienvenido a los foros de Perl en Español, sufisavey80.

Es un problema muy sencillo de resolver en Perl.

De hecho, no te hace falta hacer programa alguno. Puedes ejecutar esto desde la línea de comandos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -n -e 'print if not $la_he_visto_antes{$_}++' archivo.txt
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Así funciona:
  • arrancamos el intérprete perl con unas cuantas opciones. La opción '-n' hace que se abra el archivo.txt y que perl lo lea línea a línea, y por cada línea, ejecutamos el código indicado por '-e'
  • el programa hace lo siguiente: la línea del archivo está almacenada en la variable por defecto $_
  • se evalúa $la_he_visto_antes{$_}++, es decir, incrementamos en uno el valor correspondiente a la clave $_ del hash %la_he_visto_antes, y se devuelve el valor que tenía antes del incremento. Esto tiene el efecto de ir almacenando en el hash todas las líneas, y por cada una, se devuelve un '0' la primera vez que aparece una línea distinta de las demás (digamos que el hash va "recordando" las líneas del archivo)
  • entonces, si es la primera vez que aparece una determinada línea, devuelve un '0', que por efecto del not se convierte en un valor positivo, con lo que dispara el if(), y por lo tanto ejecuta el print(), que al no tener argumentos, por defecto saca en pantalla el valor del $_, que es justo la última línea leída del archivo
  • las siguientes veces que aparece la misma línea, la expresión $la_he_visto_antes{$_} ya devuelve un valor positivo, así que no se dispara el print()
Casi mejor leerlo de forma literal: «imprime la línea si no la has visto antes, y recuérdala».
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: Sólo los elementos repetidos

Notapor sufisavey80 » 2012-11-09 11:35 @524

Bueno día, explorer...

Muchas gracias por la ayuda... El resultado fue el esperado... buen fin de semana.
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados

cron