• Publicidad

Buscando un valor en hash

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

Buscando un valor en hash

Notapor magiza83 » 2012-03-01 12:17 @553

Hola,

Primero, ¡¡enhorabuena por el foro! Llevo una semana aprendiendo Perl y la verdad es que leyéndolo he solucionado la mayoría de los problemas que he tenido, pero ahora me he topado con uno que no sé muy bien cómo resolver. Espero explicarme bien.

Tengo el siguiente fichero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. GDATADEC.Sistemas       0 default anyone        p       cyrus   lrswipcda       root    lrswipcda       ddoljcto        lrswipd gdatmgim        lrswipd
  2. GDATADEC.Sistemas.Root  0 default anyone        p       cyrus   lrswipcda       root    lrswipcda       ddoljcto        lrsp    gdatmgim        lrswipd
  3. GDATADEC.Sistemas.apache        0 default anyone        p       cyrus   lrswipcda       root    lrswipcda       ddoljcto        lrsp    gdatmgim        lrswipd
  4. GDATADEC.Sistemas.asuser        0 default anyone        p       cyrus   lrswipcda       root    lrswipcda       ddoljcto        lrsp    gdatmgim        lrswipd
  5. GDATADEC.Sistemas.oracle        0 default anyone        p       cyrus   lrswipcda       root    lrswipcda       ddoljcto        lrsp    gdatmgim        lrswipd
  6. GDATADEC.facturas       0 default anyone        p       cyrus   lrswipcda       root    lrswipcda       gdatenun        lrswipd ddoljabe        lrswipd ddoljagl        lrswipd ddoljcto        lrswipd     ddoljgut        lrswipd ddolpgut        lrswipd ddolscal        lrswipd datavser        lrsp    gdatmgim        lrsp
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No sé si estáis familiarizados con Cyrus, pero básicamente este fichero muestra los buzones (primer campo) y los permisos para cada usuario (p.ej.: para el buzón "GDATADEC.Sistemas" el usuario "gdatmgim" tiene los permisos "lrswipd").

Sobre este fichero, me gustaría sacar aquellos usuarios que no tengan como permisos "lrswipcda" en el buzón. Una vez tenga esos usuarios, realizar una acción con el módulo de "Mail::IMAPTalk" para cambiarle los permisos. Siempre teniendo como referencia el buzón, es decir, para el buzón "GDATADEC.Sistemas.Root" el usuario que no tiene permisos es "ddoljcto" --> cambiar permisos de usuario "ddoljcto" en "GDATADEC.Sistemas.Root".

Las acciones básicas con este módulo más o menos las conozco y ya he hecho algún script, pero en este caso he intentado pasarlo todo a un hash, pero mi inexperiencia en Perl me pasa factura, y no tengo claro cómo hacer la búsqueda de los usuarios y luego realizar una acción sobre estos.

¡Muchas gracias!
magiza83
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-02-22 05:29 @270

Publicidad

Re: Buscando un valor en hash

Notapor explorer » 2012-03-01 16:05 @712

Bienvenido a los foros de Perl en español, magiza83.

No conozco mucho este formato de ficheros, pero parece que cada línea contiene el buzón seguido de pares de valores usuario/permisos.

Una forma de pasarlo a hash (una de la posibles), puede ser:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. use autodie;                    # es mejor morir que regresar con deshonor (proverbio Klingon)
  8. use Data::Dumper::Simple;
  9.  
  10. my %cyrus;                                      # Nuestro hash
  11.  
  12. open my $CYRUS, '<', 'code_29938.txt';          # Abrimos archivo
  13.  
  14. while (<$CYRUS>) {                              # por cada línea...
  15.     chomp;                                      # le quitamos el fin de línea
  16.  
  17.     my($buzon, @usuarios) = split;              # dividimos por columnas
  18.  
  19.     if (@usuarios % 2 != 0) {                   # el número de usuarios/permisos debe ser par
  20.         next;                                   # saltamos a la siguiente línea, en caso de fallo
  21.     }
  22.  
  23.     my %hash;                                   # creamos un hash usuarios => permisos
  24.  
  25.     for(my $i = 0; $i < @usuarios; $i += 2) {       # guardamos toda la información en el %hash
  26.         $hash{ $usuarios[$i] } = $usuarios[$i+1];   # usuario => permisos de ese usuario
  27.     }
  28.  
  29.     $cyrus{$buzon} = \%hash;                    # lo guardamos en el hash
  30. }
  31.  
  32. close $CYRUS;                                   # cerramos
  33.  
  34. say Dumper %cyrus;                              # mostramos cómo queda la estructura
  35.  
  36.  
  37. __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
La salida es algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
%cyrus = (
           'GDATADEC.Sistemas.asuser' => {
                                           'ddoljcto' => 'lrsp',
                                           '0' => 'default',
                                           'gdatmgim' => 'lrswipd',
                                           'root' => 'lrswipcda',
                                           'cyrus' => 'lrswipcda',
                                           'anyone' => 'p'
                                         },
           'GDATADEC.Sistemas.apache' => {
                                           'ddoljcto' => 'lrsp',
                                           '0' => 'default',
                                           'gdatmgim' => 'lrswipd',
                                           'root' => 'lrswipcda',
                                           'cyrus' => 'lrswipcda',
                                           'anyone' => 'p'
                                         },
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y a partir de aquí, ya podemos acceder a toda la información.

Por ejemplo: print $cyrus{'GDATADEC.Sistemas.asuser'}{'gdatmgim'}, "\n";

De hecho, no necesitaríamos guardar la información en un hash... bastaría con procesarla a medida de que la vamos leyendo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. use autodie;                    # es mejor morir que regresar con deshonor (proverbio Klingon)
  8. use Data::Dumper::Simple;
  9.  
  10. open my $CYRUS, '<', 'code_29938.txt';
  11.  
  12. while (<$CYRUS>) {
  13.     chomp;
  14.  
  15.     my($buzon, @usuarios) = split;
  16.  
  17.     for(my $i = 0; $i < @usuarios; $i += 2) {
  18.         if ($usuarios[$i+1] ne 'lrswipcda') {
  19.             say "Buzón [$buzon] : Usuario $usuarios[$i] : Permisos [$usuarios[$i+1]]";
  20.         }
  21.     }
  22. }
  23.  
  24. close $CYRUS;
  25.  
  26. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Buzón [GDATADEC.Sistemas] : Usuario 0 : Permisos [default]
Buzón [GDATADEC.Sistemas] : Usuario anyone : Permisos [p]
Buzón [GDATADEC.Sistemas] : Usuario ddoljcto : Permisos [lrswipd]
Buzón [GDATADEC.Sistemas] : Usuario gdatmgim : Permisos [lrswipd]
Buzón [GDATADEC.Sistemas.Root] : Usuario 0 : Permisos [default]
Buzón [GDATADEC.Sistemas.Root] : Usuario anyone : Permisos [p]
Buzón [GDATADEC.Sistemas.Root] : Usuario ddoljcto : Permisos [lrsp]
Buzón [GDATADEC.Sistemas.Root] : Usuario gdatmgim : Permisos [lrswipd]
Buzón [GDATADEC.Sistemas.apache] : Usuario 0 : Permisos [default]
Buzón [GDATADEC.Sistemas.apache] : Usuario anyone : Permisos [p]
Buzón [GDATADEC.Sistemas.apache] : Usuario ddoljcto : Permisos [lrsp]
Buzón [GDATADEC.Sistemas.apache] : Usuario gdatmgim : Permisos [lrswipd]
Buzón [GDATADEC.Sistemas.asuser] : Usuario 0 : Permisos [default]
Buzón [GDATADEC.Sistemas.asuser] : Usuario anyone : Permisos [p]
Buzón [GDATADEC.Sistemas.asuser] : Usuario ddoljcto : Permisos [lrsp]
...
Coloreado en 0.000 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscando un valor en hash

Notapor magiza83 » 2012-03-05 07:13 @342

Muchas gracias por la respuesta, ¡me ha sido de gran ayuda! ¡Y ahora tengo el script funcionando! ;) ¡Y además me ha ayudado a entender un poco más a usar los hash!

¡Gracias!
magiza83
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-02-22 05:29 @270

Re: Buscando un valor en hash

Notapor magiza83 » 2012-03-12 02:50 @160

Hola,

Siguiendo este script me he encontrado con otro problema que no acabo de entender. Tengo el siguiente método, con el que me gustaría comparar sus resultados, pero tal y como lo tengo ahora no lo consigo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ######################################
  2. #
  3. #Obtener ACLs
  4. #PARAMETROS: folder, e.j. user.gdatmgim
  5. #
  6. sub Get_ACL(){
  7.   my $Folder = shift;
  8.   my $s1ACL = $IMAPs1->getacl("$Folder") || die "IMAP error: $@";
  9.   my $s2ACL = $IMAPs2->getacl("$Folder") || die "IMAP error: $@";
  10.  
  11.   my  $s1EXIT = print Dumper $s1ACL;
  12.   my  $s2EXIT = print Dumper $s2ACL;
  13.   if ($s1EXIT and not $s2EXIT) {
  14.     print "'$Folder' exists only on master\n";
  15.   }
  16.   elsif ($s2EXIT and not $s1EXIT) {
  17.     print "'$Folder' exists only on replica\n";
  18.   }
  19.   elsif ($s1EXIT ne $s2EXIT) {
  20.      print "Mistmatched ACL for $Folder\n";
  21.   }
  22. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Si intento imprimir la variable de manera normal (print $s1ACL) obtengo un "ARRAY(0xf93728)"; si le hago un Dumper sí que obtengo la información de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = [
          'root',
          'lrswipcda',
          'cyrus',
          'lrswipcda'
        ];
$VAR1 = [
          'root',
          'lrswipcda',
          'cyrus',
          'lrswipcda'
        ];
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Pero no sé cómo puedo leer esta información. Lo que me gustaría sería tenerla como si fuese un hash, pero no sé cómo transformala ya que no sé cómo leer campo a campo la información que me da el Dumper:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = [
          'root' => 'lrswipcda',
          'cyrus' => 'lrswipcda'
        ];
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Muchas gracias.
magiza83
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-02-22 05:29 @270

Re: Buscando un valor en hash

Notapor explorer » 2012-03-12 08:20 @389

Eso último que has escrito no es un hash. Fíjate que has usado corchetes para rodear la información, no llaves.

Un hash relaciona una clave con un valor. Ese valor puede ser cualquier cosa, como por ejemplo, una referencia a uno de esos arrays anónimos. Pero, ¿y la clave? ¿qué clave sería?

Si, según lo que muestras, quieres crear un hash por cada llamada a getacl(), quedaría así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   # Obtenemos una referencia a un array
  2.   my $s1ACL = $IMAPs1->getacl("$Folder")  or  die "IMAP error: $@";
  3.  
  4.   # Transformación en un hash
  5.   my %s1ACL = @{$s1ACL};           # desreferenciamos el array,
  6.                                    # y pasamos los pares clave/valor al hash
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscando un valor en hash

Notapor magiza83 » 2012-03-13 12:32 @564

¡Gracias, explorer!

¡¡No sabía ese detalle de la llaves y corchetes! ¡Al igual que no tenía ni idea sobre la posibilidad de desreferenciar!

¡Saludos!
magiza83
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2012-02-22 05:29 @270


Volver a Básico

¿Quién está conectado?

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

cron