• Publicidad

Presentar información en forma de pares

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

Presentar información en forma de pares

Notapor situ » 2014-06-17 13:22 @599

Estimados, los molesto porque tengo el siguiente código y no sé cómo hacer para mostrar el resultado de la siguiente forma:

Necesito obtener:
usuario -> clave


El código que tengo ahora no me sirve ya que presento los datos uno debajo del otro. La variable "$response->decoded_content" es la salida de un GET a un sitio web.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. my $data = $response->decoded_content; 
  2.  
  3. if ( $data =~ m/username\":\"([0-9|\.]*)/) { 
  4. push (@username,$1); 
  5.  
  6. if($data =~ m/clave\":\"([a-zA-Z0-9]{32})/) { 
  7. push (@clave,$1); 
  8. for $username (@username) { 
  9.   print "$username\n"; 
  10. for $clave (@clave) { 
  11.   print "$clave\n"; 


Salida del script actual:
usuario1
usuario2
clave1
clave2


¿Alguien me puede ayudar?

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Presentar información en forma de pares

Notapor explorer » 2014-06-17 15:17 @678

Puedes usar el método zip() del módulo List::MoreUtils (que tendrás ya instalado), pero seguro que se puede hacer mejor si viéramos un ejemplo de lo que devuelve decoded_content(), porque casi seguro que se puede resolver con solo una expresión regular.
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: Presentar información en forma de pares

Notapor situ » 2014-06-17 15:27 @685

Devuelve lo siguiente:
{"indice":{"username":"user1","test":nada,"clave":clave1},{"username":"user2","test":nada,"clave":"clave2"}}


Saludos y gracias.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Presentar información en forma de pares

Notapor situ » 2014-06-17 15:39 @694

No sé si es lo mejor pero haciendo prueba-error pude:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $data =~ m/username\":\"([0-9|\.]*).*clave\":\"([0-9|\.]*)"$/) {
  2.     print "$1 $2\n";
  3. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Presentar información en forma de pares

Notapor explorer » 2014-06-17 16:51 @744

A mi no me funciona tu solución, con el ejemplo que has puesto.

Lo curioso es que la clave1 no está entrecomillada...

Esta es otra solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3.  
  4. my $decoded_content = '{"indice":{"username":"user1","test":nada,"clave":clave1},{"username":"user2","test":nada,"clave":"clave2"}}';
  5.  
  6. while ($decoded_content =~ m/username":"(\w*?)".*?clave":"?(\w*?)"?\}/g) {
  7.     say "$1 $2";
  8. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien... parece que lo que te devuelve está en formato JSON, así que se puede hacer de forma programática y mucho más limpia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use Mojo::JSON;
  4.  
  5. my $json = Mojo::JSON->new;
  6. my $hash = $json->decode('{"indice":[{"username":"user1","test":"nada","clave":"clave1"},{"username":"user2","test":"nada","clave":"clave2"}]}');
  7.  
  8. #say $json->error;
  9. #use Data::Dumper;
  10. #say Dumper \$hash;
  11.  
  12. for my $hash_ref (@{$hash->{'indice'}}) {
  13.     say "$hash_ref->{'username'}: $hash_ref->{'clave'}";
  14. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero para que funcione, debe ser formato JSON, y el ejemplo que has puesto no es conforme a ese estándar (sí lo es el que está en este último ejemplo).
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: Presentar información en forma de pares

Notapor situ » 2014-06-17 18:07 @796

Tal como indicas es JSON, y yo solamente mostré una parte del código. Lo de la clave me olvidé de agregar la comilla.

Me quedó así el script pero no me está funcionado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use LWP::UserAgent;
  4. use HTTP::Request::Common;
  5. use Mojo::JSON;
  6. no warnings;
  7.  
  8.  
  9. my $url_login = 'http://localhost/ActionGetIndice?_=1&indice.id=';
  10.  
  11. $useragent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1';
  12.  
  13. @header = ( 'User-Agent' => $useragent, 'Connection' => 'keep-alive', 'Keep-Alive' => '200' );
  14.  
  15. for ( my $i = 1; $i <= 2; $i++ ) {
  16.  
  17.     my $ua = LWP::UserAgent->new() or die;
  18.  
  19.     $ua->timeout(10);
  20.  
  21.     my $response = $ua->request( GET "$url_login$i", @header );
  22.     my $data = $response->decoded_content;
  23.  
  24.     my $json = Mojo::JSON->new;
  25.  
  26.     my $hash = $json->decode( $response->decoded_content );
  27.  
  28.     for my $hash_ref ( @{ $hash->{'indice'} } ) {
  29.         print "$hash_ref->{'username'}: $hash_ref->{'clave'}";
  30.     }
  31. }
  32.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Obtengo al ejecutarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. Not an ARRAY reference at informacion_de_grupos_JSON.pl line 28. 



Saludos
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Presentar información en forma de pares

Notapor explorer » 2014-06-17 20:21 @889

Fíjate en mi anterior mensaje. Hay comentadas dos líneas que sirven para mostrar el volcado (Dumper) de la estructura devuelta por decode().

El mensaje de error está diciendo que no estamos manejando esa estructura de forma correcta ("No es una referencia a un ARRAY").

¿Seguro que se llama "indice" una estructura que almacena una lista de registros?

Con Data::Dumper puedes verlo. Y si hay un error en la interpretación, $json->error() lo indicará.
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: Presentar información en forma de pares

Notapor situ » 2014-06-17 20:42 @904

El dumper entrega perfecta la estructura del JSON y los datos, pero cuando quiero imprimir el HASH obtengo la referencia del error anterior del ARRAY. :S
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Presentar información en forma de pares

Notapor explorer » 2014-06-18 06:14 @301

Por favor, publica las primeras líneas del Dumper, para ver la estructura. Falsea los datos de usuarios y sus claves.
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: Presentar información en forma de pares

Notapor situ » 2014-06-18 18:53 @829

Algo así es la salida:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. $VAR1 = \{
  2.             'rankingusuarios' => [
  3.                                    {
  4.                                        'usuario' => {
  5.                                                       'id' => undef,
  6.                                                       'info' => undef
  7.                                                      }
  8.                                    }
  9.                                   ],
  10.                                
  11.                                                                                          
  12.             'grupo' => {
  13.                                         'usuarios' => [
  14.                                                         {
  15.                                                            'id' => undef,
  16.                                                            'info' => undef,
  17.                                                            'username' => usuario1,
  18.                                                             'clave' => 'clave1'
  19.  
  20.                                                           }
  21.                                                       ],
  22.  
  23.                         }
  24.           };
  25.  
  26.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron