• Publicidad

Fallos sintácticos y avisos (warning)

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

Re: Fallos sintácticos y avisos (warning)

Notapor gonzal » 2012-01-18 05:08 @255

No hay más... ¿qué usuarios esperas que salgan?


Primero agradecerte, sinceramente, @explorer tu siempre ayuda..

Pues cuando ejecuto los comandos(son pruebas que tiene que pasar el script):

mostrar_grupo usuario
mostrar_grupo usuario -p
mostrar_grupo 1000 -p

no me aparecen los siguientes usuarios que debería de aparecer viendo los resultados correctos para dichas pruebas:

usuario UID primario/secundario
========== ===== ===================
usuario 1000 primario
ejuarez 1001 primario
prueba 1005 primario

Sin embargo, el que sí me aparece correctamente cuando tiene que aparecer es este:

usuario UID primario/secundario
========== ===== ===================
prueba2 1002 secundario

¿por qué? :roll:
gonzal
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-05-05 09:03 @419

Publicidad

Re: Fallos sintácticos y avisos (warning)

Notapor explorer » 2012-01-18 08:01 @375

Si pongo estas líneas en el programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use feature qw"switch say";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Data::Dumper::Simple;
  2. say Dumper $grupos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y ejecuto el comando 'mostrar_grupo usuario', sale el volcado de la estructura $grupos. Entre todas las líneas que salen, aparece esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
            'porUsuario' => {
                              'prueba2' => [
                                             $grupos->{'datos'}{'usuario'}
                                           ],
                              'usuario' => [
                                             $grupos->{'datos'}{'dialout'},
                                             $grupos->{'datos'}{'cdrom'},
                                             $grupos->{'datos'}{'floppy'},
                                             $grupos->{'datos'}{'audio'},
                                             $grupos->{'datos'}{'www-data'},
                                             $grupos->{'datos'}{'video'}
                                           ],
                              'ejuarez' => [
                                             $grupos->{'datos'}{'cdrom'},
                                             $grupos->{'datos'}{'floppy'},
                                             $grupos->{'porGid'}{'100'}
                                           ],
                              'postgres' => [
                                              $grupos->{'datos'}{'ssl-cert'}
                                            ]
                            },
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y ya empezamos a ver problemas: los usuarios no tienen bien registrado los grupos a los que pertenecen. Por ejemplo, el usuario 'ejuarez' aparece ahí que pertenece a los grupos 'cdrom', 'floppy' y al 100 ('users'), pero en el fichero passwd se indica que su grupo principal es el 1000 ('usuario'). O por ejemplo, el usuario 'usuario': tampoco viene indicado que pertenezca al grupo 'usuario'.

Cuando mandamos ejecutar el comando 'mostrar_grupo usuario', el programa recupera $grupos->{porNombre}->{usuario}, que apunta a $grupos->{'datos'}{'usuario'}, y según el Dumper, esto es lo que contiene:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
                         'usuario' => {
                                        'password' => 'x',
                                        'name' => 'usuario',
                                        'users' => [
                                                     'prueba2'
                                                   ],
                                        'gid' => '1000'
                                      },
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y vemos que solo contiene al usuario 'pruebas2'.

Así que está mal la lectura de los datos. En la subrutina cargar_usuarios(), no se actualiza la variable $grupos con los grupos principales a los que pertenecen los usuarios.

Recuerda: Data::Dumper es tu amigo (también Data::Dumper::Simple, pero éste tienes que instalarlo antes).
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: Fallos sintácticos y avisos (warning)

Notapor gonzal » 2012-01-19 04:25 @226

Gracias @explorer, voy entendiendo el error, ayer estuve intentando buscar el fallo en estas líneas de código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub cargar_usuarios
  2. {
  3.         #Borramos los usuarios actuales
  4.         $usuarios = {
  5.                 #Indices
  6.                 "porNombre"=>{},
  7.                 "porUid"=>{},
  8.                 "porCasa"=>{},
  9.                
  10.                 #Datos
  11.                 "datos"=>{},
  12.         };
  13.         #Cargamos los datos del fichero
  14.         open(my $ficheroUsuarios,  "<",  $config->{"PASSWD"});
  15.         while(my $linea = <$ficheroUsuarios>)
  16.         {
  17.                 $linea =~ /^(.*):(.*):(.*):(.*):(.*):(.*):(.*)$/;
  18.                
  19.                 #asignación de los valores a la global de usuarios
  20.                 #en sus distintos índices
  21.                 $usuarios->{"datos"}->{$1} = {
  22.                         "name"=> (defined $1)? $1: "",
  23.                         "password"=>(defined $2)? $2: "",
  24.                         "uid"=>(defined $3)? $3: "",
  25.                         "gid"=>(defined $4)? $4: "",
  26.                         "fullName"=>(defined $5)? $5: "",
  27.                         "home"=>(defined $6)? $6: "",
  28.                         "shell"=>(defined $7)? $7: "",
  29.                 };
  30.                 if(defined $6)
  31.                 {
  32.                         $usuarios->{"porCasa"}->{$6} = $usuarios->{"datos"}->{$1};
  33.                 }
  34.                 $usuarios->{"porNombre"}->{$1} = $usuarios->{"datos"}->{$1};
  35.                 $usuarios->{"porUid"}->{$3} = $usuarios->{"datos"}->{$1};
  36.                
  37.         }
  38.         close($ficheroUsuarios);
  39. }
  40.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero he intentado hacer varios cambios para que se actualice la variable $grupos, y al final, o me sale lo mismo o llega un momento en el que ya no me aparece ningún usuario perteneciente al grupo.
gonzal
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-05-05 09:03 @419

Re: Fallos sintácticos y avisos (warning)

Notapor explorer » 2012-01-19 11:05 @503

Solo tienes que agregar una línea, dentro del while(), en donde hagas un push al array que guarda los valores de los grupos de ese usuario, con un valor más, que es el de gid que acabas de extraer de la línea leída. Por ejemplo, en la línea 36, la puedes poner.

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. push  @{ $grupos->{'porUsuario'}->{$1} }, $grupos->{'porGid'}->{$4};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(No lo he probado, seguro que algo está mal escrito)
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: Fallos sintácticos y avisos (warning)

Notapor gonzal » 2012-01-20 04:33 @231

Gracias, explorer, lo he probado y no me llega a funcionar. Lo que yo sé, que es poco, sobre la función push() es que añade elementos al final de un array. Tiene el formato push (@Array, "Elementos");

Supongo que es lo mismo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. push(@{$grupos->{"porUsuario"}->{$1}},$grupos->{"porGid"}->{$4});
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Porque en el resto no sé en qué puede estar fallando.

Seguiré probando e investigando dónde puede estar el error.
gonzal
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-05-05 09:03 @419

Re: Fallos sintácticos y avisos (warning)

Notapor explorer » 2012-01-20 18:44 @822

Creo que encontré la solución.

Las líneas correctas son:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 push @{ $grupos->{'porUsuario'}->{$1} }, $grupos->{'porGid'}->{$4};
  2.                 push @{ $grupos->{'porUsuario'}->{$1}->[-1]->{users} }, $1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(dentro de cargar_usuarios(), al final del bucle while(), dentro de él).

La primera línea agrega el grupo principal del usuario (definido en passwd), a la lista de grupos a los que pertenece el usuario (creado antes en cargar_grupos()).

La segunda línea actualiza el registro que acabamos de poner, con el nombre del propio usuario ($1), en la lista de usuarios que pertenecen a ese grupo.

Ahora ya sale algo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
(ayuda/salir)? mostrar_grupo usuario
usuario     UID  primario/secundario
========== ===== ===================
   prueba2  1002 secundario
   usuario  1000 primario
   ejuarez  1001 primario
    prueba  1005 primario

(ayuda/salir)? mostrar_grupo cdrom
usuario     UID  primario/secundario
========== ===== ===================
   usuario  1000 secundario
   ejuarez  1001 secundario

(ayuda/salir)?
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Pero viendo esas dos líneas monstruosas... me da que la estructura de datos que has elegido, es demasiado complicada...

De hecho, haciendo el Dumper de la estructura $grupos... se siguen viendo errores.
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: Fallos sintácticos y avisos (warning)

Notapor gonzal » 2012-01-21 06:17 @303

explorer: eres una máquina. Si te soy sincero no hubiese encontrado el fallo nunca... Muchas gracias, acabas de corregir el 90% de los errores que me daba el programa :D :D :D

Yo también he llegado a pensar que la estructura de datos no es la más adecuada, pero ya no me da tiempo para cambiarla, sería casi un volver a empezar... y como que me entran unos sudores fríos. ¡je,je!

Otro error que me da, éste creo que bastante más sencillo, aunque no consigo dar con la tecla, es el de que no inicializa el fichero histórico. Este es su pequeño código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #Guarda un comando en el histórico de comandos. El histórico se guarda en un
  2. #fichero, cuyo nombre queda determinado por el parametro global HISTORICO
  3. #en $config
  4. #Parametros:
  5. #  parametro Escalar de texto, el parametro completo
  6. sub guardar_historico
  7. {
  8.         my $comando = shift;
  9.     open(HTS,">>".$config->{"HISTORICO"});
  10.     print HTS "$comando \n";
  11.     close(HTS);
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y en subrutina gestionar_comando:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub gestionar_comando
  2. {
  3.         my $comando = shift;
  4.         my $resultado = 0;
  5.        
  6.         #Guardamos el comando en el histórico
  7.         guardar_historico($comando);
  8.        
  9.         #Parseamos el comando
  10.         given($comando)
  11.         {
  12.                 when (/^salir$/)
  13.                 {
  14.                         #salimos del programa
  15.                         $resultado = comando_salir();
  16.                 }
  17.                 when (/^ayuda$/)
  18.                 {
  19.                         #Mostramos el menú de ayuda
  20.                         $resultado = comando_mostrar_ayuda();
  21.                 }
  22.                 when (/^mostrar_historico$/)
  23.                 {
  24.                         #Mostramos el historial de comandos
  25.                         $resultado = comando_mostrar_historico();
  26.                 }
  27. ...........................................
  28. ...........................................
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Los puntos suspensivos son porque sigue con más opciones, pero la que interesa es únicamente esa de mostrar histórico.

explorer, una vez más, muchísimas gracias...
gonzal
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-05-05 09:03 @419

Re: Fallos sintácticos y avisos (warning)

Notapor explorer » 2012-01-21 18:47 @824

El problema está en que los comandos los estás guardando con un espacio en blanco demás. Observa que hay un espacio entre $comando y "\n".

Por eso, luego, a la hora de leer los comandos, haces el chomp(), para quitarle el retorno de carro, pero el espacio en blanco sigue con ellos. Y por eso, no coincide con ningún comando del given() de la subrutina gestionar_comando().
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: Fallos sintácticos y avisos (warning)

Notapor gonzal » 2012-01-24 04:02 @210

He quitado ese espacio pero no resuelve el problema de que no se inicializan los fichero históricos, es decir, cuando ejecuto la orden salir, debería de borrar todos los comandos guardados para cuando vuelva a ejecutar el script empezar de cero.

Debería de tener una salida así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. 16 : mostrar_historico
  2. Histórico. (../script/historico2.txt)
  3. ---------------------------------
  4. 1 cambiar_fichero_configuracion config2.txt
  5. 2 mostrar_directorio ../home2
  6. 3 mostrar_usuario usuario
  7. 4 mostrar_usuario alum1
  8. 5 mostrar_usuario 2001
  9. 6 mostrar_grupo usuario
  10. 7 mostrar_grupo alumnos
  11. 8 mostrar_grupo users
  12. 9 mostrar_grupo 2000
  13. 10 mostrar_grupo 2000 -s
  14. 11 mostrar_grupo 2000 -p
  15. 12 mostrar_grupo 2001
  16. 13 mostrar_grupo grupo_prueba -s
  17. 14 mostrar_grupo grupo_prueba -p
  18. ---------------------------------
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Pero en mi caso muestra todos los comandos guardados, aunque haya salido del programa, y sin numeración.
gonzal
Perlero nuevo
Perlero nuevo
 
Mensajes: 25
Registrado: 2009-05-05 09:03 @419

Re: Fallos sintácticos y avisos (warning)

Notapor explorer » 2012-01-24 12:59 @583

No entiendo lo que quieres decir.

Yo veo que los comandos se guardan sin numeración. La numeración solo aparece en la pantalla, según la línea 237.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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