• 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.

Re: Script con funciones

Notapor olgamc » 2013-12-11 12:46 @573

Sé que no puedo avanzar hasta que arregle los errores, estoy intentando solucionarlos para seguir haciendo el ejercicio.
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Publicidad

Re: Script con funciones

Notapor explorer » 2013-12-11 13:10 @590

Si hay algún error que no consigues arreglar, indícalo aquí.
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-12 07:22 @349

Sigo con el ejercicio y modificando, estoy con el apartado opción -g (mostrar los grupos a los que pertenece el usuario...).
Me comentaste que debería usar un hash en este caso, pero no sé cómo ponerlo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use POSIX;
  6.  
  7. my $archivo = 'etc/passwd';
  8. # my %hgrupos;
  9.  
  10. open (USUARIO,$archivo) or die "No se puede abrir archivo $archivo: $!\n";
  11.  
  12. sub mostrar_grupos{
  13.   if ($ARGV[1] eq "-g")
  14.   {
  15.         my $i=0;
  16.         if(isdigit($ARGV[2]))
  17.         {
  18.           my $uid=`cut -d: -f3 "$archivo" | grep -w "$ARGV[2]"`;
  19.           if($uid != "")
  20.           {        
  21.             foreach $archivo (@lineas)
  22.             {
  23.                 my @grupos=split/:/,$linea;
  24.                 if ($grupos[3]==$grupo){
  25.                         print "usuario $grupos[0] pertenece al GID $grupo\n";
  26.                         $i++;
  27.                 }
  28.             }
  29.           }
  30.           else
  31.             print("UID no valido\n");
  32.         }
  33.         else
  34.         {
  35.           my $uid=`cut -d: -f1 $archivo | grep -w $ARGV[2]`;
  36.           if($uid != "")
  37.           {        
  38.             foreach $archivo (@lineas)
  39.             {
  40.                 my @grupos=split/:/,$linea;
  41.                 if ($grupos[3]==$grupo){
  42.                         print "usuario $grupos[0] pertenece al GID $grupo\n";
  43.                         $i++;
  44.                 }
  45.             }
  46.            }
  47.            else
  48.             print("Nombre de usuario no valido\n");
  49.           }
  50.          
  51.   }
  52. }
  53. close (USUARIO) or die "No se puede cerrar archivo $archivo: $!\n";
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


También me siguen saliendo errores de "requires explicit package name at ejercicio.pl" y de otros tipo.
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Script con funciones

Notapor explorer » 2013-12-12 07:52 @369

En mi primera respuesta a ti de este otro hilo verás cómo leo el archivo de grupos y lo voy almacenando en un hash. Bueno, la idea es muy parecida:
  • debes leer la información del archivo passwd para sacar la lista de usuarios, que serán las claves de un hash. Como valores iniciales, los del id del grupo al que pertenecen
  • luego debes leer la información del archivo group. Por cada grupo, miras a ver si tiene indicado usuarios extra (están listados al final de la línea). En ese caso, debes recorrerlos y agregar el id de ese grupo a los id de los grupos al que pertenece ese usuario. Finalmente, guardas en otro hash la correspondencia id => nombre del grupo, que te servirá para el último paso
  • ya puedes responder a la pregunta que te llega por la línea de comandos: accedes al hash por el nombre de usuario, y solo tienes que leer su valor, que será la lista de id de grupos. Por cada uno de ellos, con el segundo hash, sacas su nombre a pantalla
(Esta es una forma de hacerlo, claro. Además, no necesita de 'cut' ni 'grep' externos :) )
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-12 08:14 @385

Sigo con ello entonces, voy a intentar sacar algo que no voy por buen camino.
gracias
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Script con funciones

Notapor olgamc » 2013-12-12 08:21 @390

Dejando lo del 'cut' y 'grep', podría usar la variable $uid para buscar el usuario del archivo /etc/passwd y con el hash del archivo /etc/group busco todas los coincidencias de ese $uid.
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Script con funciones

Notapor explorer » 2013-12-12 11:16 @511

No sé si has hecho una pregunta o no, en tu última respuesta. No veo los signos de interrogación.

En todo caso, estos son los errores que veo en tu último código:
  • línea 10: abres $archivo y lo asocias a USUARIO. Luego lo cierras en la línea 53, pero... no lo lees en ninguna parte
  • a partir de la línea 12 defines la subrutina mostrar_grupos(), pero... no la llamas desde ninguna parte
  • en la línea 19 usas el comparador numérico '!=', pero lo haces sobre cadenas de caracteres. Lo correcto es usar el operador 'ne'
  • en las líneas 21 y 38, no sabemos de dónde viene @lineas
  • en las líneas 23 y 40, no sabemos de dónde viene $linea
  • en las líneas 24 y 41, no sabemos de dónde viene $grupo
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-12 11:56 @539

Si, olvidé poner el simbolo de interrogación.
Lo que me comentas creo que ya lo tengo todo arreglado.
Tengo una pregunta, ¿como compararia el uid del usuario que estoy buscando con los valores del hash?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub mostrar_grupos
  2. {
  3.         my ($uid) = @_;#el id de usuario que queremos buscar en el hash
  4.         foreach my $linea (keys %hgrupos)#es el hash del archivo /etc/group
  5.         {#nuestro hash es: floppy = x:25:zerokullneo
  6.                 my @h_grupo = split /:/, %hgrupos;
  7.                 if($h_grupo[1] == $uid)#comparar el $uid a buscar con la posición correspondiente en el hash
  8.                 {
  9.                         print "usuario $uid pertenece al Grupo $hgrupos{$linea}\n";
  10.                 }
  11.         }
  12. }
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Script con funciones

Notapor explorer » 2013-12-12 13:27 @602

Ya te lo hemos dicho antes: con el operador de comparación de cadenas 'eq' (para igualdad) o el 'ne' (para desigualdad).

Si en la línea 7, tanto $uid como $h_grupo[1] son numéricos, pues te vale con el operador de comparación numérica '=='.

Pero...
  • en la línea 4 usas $linea para guardar las correspondientes claves de %hgrupos, pero... luego no usas $linea en ningún sitio
  • no puedes aplicar split a un hash, en la línea 6. O al menos, seguro que no es lo que realmente quieres hacer.
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-12 13:32 @606

Sí, lo siento, ya me había dado cuenta el uso de '==' y lo había cambiado. Lo que estoy intentando hacer es separar los valores del hash para comparar, ¿cómo se haría?
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron