• Publicidad

Script con funciones

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

Script con funciones

Notapor olgamc » 2013-12-09 15:03 @668

Hola, espero que podáis ayudarme con un ejercicio que no consigo hacer. Usando el fichero /etc/passwd "opcpasswd" que tiene que admitir las opciones -h idusuario | -g idusuario:
  • -h muestra el árbol de directorios y archivos (de forma recursiva del usuario indicando idusuario y ver antes si existe usuario)
  • -g muestra los grupos a los que pertenece el usuario idusuario (indicar GID de grupo y ver antes si existe usuario)
Tengo hecho lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. open (USUARIO,"/etc/passwd") or die "No se puede abrir archivo $archivo: $!\n";
  3.  
  4. if (($ARV[0]="-g")&&($ARV[1]="etc/passwd"))
  5. {
  6.         $i=0;
  7.         print "Introduce GID usuario a buscar:";
  8.         chomp($grupo=<STDIN>);
  9.         shift @ARV, "-g";
  10.         @linea=<>;
  11.         foreach $linea (@lineas){
  12.                 @palabras=split/:/,$linea;
  13.                 if ($palabras)[3]==$grupo){
  14.                         print "usuario $palabras[0] pertenece al GID $grupo\n";
  15.                         $i++;
  16.                 }
  17.         }
  18.         if ($i==0){
  19.                 print("GID no valido\n");
  20.         }
  21.         else{
  22.                 print("Argumento no validos\n");
  23.         }
  24. }
  25. close (USUARIOS)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Y me dicen que debo hacerlo usando vectores y hash, hacerlo con funciones y comprobar que la llamada al script desde la línea de órdenes sea correcta.

:( Espero que podáis ayudarme. Muchas gracias.
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Publicidad

Re: Script con funciones

Notapor explorer » 2013-12-09 15:42 @695

Hay unos cuántos errores en el código...
  • en la línea 2 abres el archivo "/etc/passwd", pero no lo lees en ninguna parte
  • en la línea 25 cierras el archivo asociado a USUARIOS, pero resulta que ese gestor no existe
  • en la línea 4 usas '=' como un comparador de igualdad de cadenas de caracteres, y resulta que ese es el operador de asignación. El comparador de igualdad de cadenas de caracteres es 'eq'
  • en la línea 9 llamas a shift con dos argumentos, cuando solo requiere uno
  • en la línea 11 quieres hacer un bucle por los valores de @lineas, pero esa variable no se ha inicializado en ningún sitio
  • la línea 13 está mal escrita (hay un paréntesis demás)
El uso de hash quizás se refiere a que primero debes leer el archivo /etc/passwd y pasar su información a un hash. No es obligatorio en el primer caso (-h), pero en el caso del segundo (-g) sí que es interesante usarlo con archivo de grupos.
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: Script con funciones

Notapor olgamc » 2013-12-10 03:18 @179

¡Gracias, explorer, como siempre, por ayudar!

Creo que hice las modificaciones que me indicaste, pero la de la línea 11 no sé cómo arreglarlo.
Continúo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $archivo = 'etc/passwd';
  3. my %_grupos;
  4.  
  5. open( USUARIO, $archivo ) or die "No se puede abrir archivo $archivo: $!\n";
  6.  
  7. sub grupos {
  8.     if ( ( $ARV[0] eq "-g" ) && ( $ARV[1] eq "etc/passwd" ) ) {
  9.         $i = 0;
  10.         print "Introduce GID usuario a buscar:";
  11.         chomp( $grupo = <STDIN> );
  12.         shift @ARV;
  13.         @linea = <>;
  14.         foreach $linea (@lineas) {
  15.             @palabras = split /:/, $linea;
  16.             if ( $palabras[3] == $grupo ) {
  17.                 print "usuario $palabras[0] pertenece al GID $grupo\n";
  18.                 $i++;
  19.             }
  20.         }
  21.         if ( $i == 0 ) {
  22.             print("GID no valido\n");
  23.         }
  24.         else {
  25.             print("Argumento no validos\n");
  26.         }
  27.     }
  28. }
  29. close(USUARIO) or die "No se puede cerrar archivo $archivo: $!\n";
  30.  
  31. open( USUARIO, $archivo ) or die "No se puede abrir archivo $archivo: $!\n";
  32.  
  33. sub directorios {
  34.     if ( ( $ARV[0] eq "-h" ) && ( $ARV[1] eq "etc/passwd" ) ) {
  35.         my ($path) = ( $_[0] );
  36.         opendir( DIR, $path ) or die "No se puede abrir el directorio: $!\n";    #abre el directorio
  37.         my @archivos = grep( !/^\./, readdir(DIR) );
  38.         closedir(DIR);
  39.         foreach $archivo (@archivos) { #llamada recursiva
  40.             $archivo = $path . '/' . $archivo;
  41.             if ( -d $archivo ) {
  42.                 open_dir( $archivo, $hash );
  43.             }
  44.             else {
  45.                 print $archivo"\n";
  46.             }
  47.         }
  48.     }
  49. }
  50. close(USUARIO) or die "No se puede cerrar archivo $archivo: $!\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2013-12-10 06:47 @324, editado 2 veces en total
Razón: Formateado de código con Perltidy
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Script con funciones

Notapor Aceitunas » 2013-12-10 05:39 @277

Hola olgamc,

explorer se refiere a que el array @lineas no tiene asignados valores, o sea, está vacío.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Script con funciones

Notapor explorer » 2013-12-10 06:52 @327

Si después de la primera línea insertas estas cuatro
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use diagnostics;
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
el propio Perl te ayudará:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
String found where operator expected at ./code_36260.pl line 49, near
        "$archivo"\n"" (#1)
    (S syntax) The Perl lexer knows whether to expect a term or an operator.
    If it sees what it knows to be a term when it was expecting to see an
    operator, it gives you this warning.  Usually it indicates that an
    operator or delimiter was omitted, such as a semicolon.
   
Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 12.
Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 12.
Global symbol "$i" requires explicit package name at ./code_36260.pl line 13.
Global symbol "$grupo" requires explicit package name at ./code_36260.pl line 15.
Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 16.
Global symbol "@linea" requires explicit package name at ./code_36260.pl line 17.
Global symbol "$linea" requires explicit package name at ./code_36260.pl line 18.
Global symbol "@lineas" requires explicit package name at ./code_36260.pl line 18.
Global symbol "@palabras" requires explicit package name at ./code_36260.pl line 19.
Global symbol "$linea" requires explicit package name at ./code_36260.pl line 19.
Global symbol "@palabras" requires explicit package name at ./code_36260.pl line 20.
Global symbol "$grupo" requires explicit package name at ./code_36260.pl line 20.
Global symbol "@palabras" requires explicit package name at ./code_36260.pl line 21.
Global symbol "$grupo" requires explicit package name at ./code_36260.pl line 21.
Global symbol "$i" requires explicit package name at ./code_36260.pl line 22.
Global symbol "$i" requires explicit package name at ./code_36260.pl line 25.
Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 38.
Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 38.
Global symbol "$hash" requires explicit package name at ./code_36260.pl line 46.
./code_36260.pl has too many errors (#2)
    (F) You've said "use strict" or "use strict vars", which indicates
    that all variables must either be lexically scoped (using "my" or "state"),
    declared beforehand using "our", or explicitly qualified to say
    which package the global variable is in (using "::").
   
Uncaught exception from user code:
        Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 12.
        Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 12.
        Global symbol "$i" requires explicit package name at ./code_36260.pl line 13.
        Global symbol "$grupo" requires explicit package name at ./code_36260.pl line 15.
        Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 16.
        Global symbol "@linea" requires explicit package name at ./code_36260.pl line 17.
        Global symbol "$linea" requires explicit package name at ./code_36260.pl line 18.
        Global symbol "@lineas" requires explicit package name at ./code_36260.pl line 18.
        Global symbol "@palabras" requires explicit package name at ./code_36260.pl line 19.
        Global symbol "$linea" requires explicit package name at ./code_36260.pl line 19.
        Global symbol "@palabras" requires explicit package name at ./code_36260.pl line 20.
        Global symbol "$grupo" requires explicit package name at ./code_36260.pl line 20.
        Global symbol "@palabras" requires explicit package name at ./code_36260.pl line 21.
        Global symbol "$grupo" requires explicit package name at ./code_36260.pl line 21.
        Global symbol "$i" requires explicit package name at ./code_36260.pl line 22.
        Global symbol "$i" requires explicit package name at ./code_36260.pl line 25.
        Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 38.
        Global symbol "@ARV" requires explicit package name at ./code_36260.pl line 38.
        Global symbol "$hash" requires explicit package name at ./code_36260.pl line 46.
        ./code_36260.pl has too many errors.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por ejemplo, te dice que @ARV no sabe de dónde viene esa variable. Como la estás usando para leer los argumentos pasados al programa, seguro que lo que querías haber puesto es @ARGV.

Para comprobar si el programa está bien, ejecútalo con la opción '-c', que lo que hace es la fase de compilación del programa, pero no la de ejecución: perl -c code_36260.pl
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: Script con funciones

Notapor olgamc » 2013-12-11 07:53 @370

He puesto las líneas que me indicas y también he ejecutado con la opción -c pero en este caso no me sale nada.

¿Cómo daría valores al array @lineas (lo que dice "Aceitunas")?
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Script con funciones

Notapor explorer » 2013-12-11 08:08 @381

olgamc escribiste:He puesto las líneas que me indicas y también he ejecutado con la opción -c pero en este caso no me sale nada.
Si no sale nada al ejecutarlo con '-c' es que no hay errores. De hecho, debería salir un mensaje así:

code_36260.pl syntax OK

olgamc escribiste:¿Cómo daría valores al array @lineas (lo que dice "Aceitunas")?
Un momento... el programa es tuyo... ¿no sabes por qué has escrito esa línea?
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: Script con funciones

Notapor olgamc » 2013-12-11 11:18 @512

Sí, es mio lo que he puesto, es un ejercicio que estoy que estoy intentando resolver.
Me da algunos errores, por lo que no me sale "syntax OK".
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Script con funciones

Notapor Aceitunas » 2013-12-11 11:33 @523

Replantea el algoritmo de nuevo en seudocódigo y como pista para inicializar @linea, con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @linea = <USUARIOS>;
  2.                
  3. foreach my $i (@linea)
  4. {
  5.     print "Linea ->" . $i . "\n";
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tienes un array con las líneas del archivo que has leído.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Script con funciones

Notapor explorer » 2013-12-11 11:47 @532

Si no sale el "syntax OK", es que salen errores. Hasta que no los corrijas, no puedes seguir adelante.

Lo que te decía de @lineas, es porque no podía creerme que no te dieras cuenta de que el fallo estaba en la línea 13: @linea = <>;
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

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado