• Publicidad

Ejercicio con hashes y archivos

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

Re: Ejercicio con hashes y archivos

Notapor olgamc » 2013-09-06 03:46 @199

Entiendo lo que me dices y leyendo el enunciado veo lo de la función insertar, pero no soy capaz de hacerla :(
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Publicidad

Re: Ejercicio con hashes y archivos

Notapor explorer » 2013-09-06 08:07 @379

Esta es una posible solución, según entiendo lo que pide el enunciado del problema.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $archivo = 'etc/group';
  3. my %vgrupos;
  4.  
  5. # Leer 'etc/group' y pasarlo a una estructura llamada VGrupos
  6. open(GRUPOS, $archivo) or die "No se puede abrir archivo $archivo: $!\n";
  7.  
  8. while (my $linea_grupos = <GRUPOS>) {
  9.     chomp $linea_grupos;                                         # quitamos los caracteres finales de línea
  10.  
  11.     my @campos = split /:/, $linea_grupos;
  12.  
  13.     $vgrupos{ $campos[0] } = join(':', @campos[1 .. $#campos]);  # nombre de grupo -> resto de la línea
  14. }
  15.  
  16. close(GRUPOS) or die "No se puede cerrar archivo $archivo: $!\n";
  17.  
  18. # comprobación
  19. #use Data::Dumper;
  20. #print Dumper \%vgrupos;
  21.  
  22.  
  23. # Luego nos pedirán de forma cíclica un nombre de grupo y un GID
  24. while (1) {
  25.     print "Introduzca un nombre de grupo: ";
  26.     $nombre_nuevo_grupo = <STDIN>;
  27.     chomp $nombre_nuevo_grupo;
  28.  
  29.     # Cuando se pulse el nombre del grupo vacío, entendemos que no queremos seguir introduciendo grupos
  30.     last if $nombre_nuevo_grupo eq '';          # salimos si no hay nombre de grupo
  31.  
  32.     print "Introduzca un GID: ";
  33.     $gid = <STDIN>;
  34.     chomp $gid;
  35.  
  36.     # se llamará a una función que añada dicho grupo a la estructura VGrupos
  37.     # esta función recibirá por valor el GID, el nombre de grupo y, por referencia, VGrupos.
  38.     agregar($gid, $nombre_nuevo_grupo, \%vgrupos);
  39. }
  40.  
  41.  
  42. # y pasamos nuestra estructura al fichero etc/group.
  43. open(NUEVOGRUPOS, ">$archivo") or die "No se puede escribir en archivo $archivo: $!\n";
  44.  
  45. for my $nombre_grupo (sort keys %vgrupos) {
  46.     print NUEVOGRUPOS join(':', $nombre_grupo, $vgrupos{$nombre_grupo}), "\n";
  47. }
  48.  
  49. close NUEVOGRUPOS;
  50.  
  51. # subrutinas
  52. sub agregar {
  53.     my($gid, $nombre_grupo, $vgrupos_ref) = @_;
  54.  
  55.     # Comprobaremos que no existe grupo con otra función
  56.     # ésta usará la estructura HASH (creada antes indicando dicha situación y su GID)
  57.     $existe = comprobar_grupo($nombre_grupo, $vgrupos_ref);
  58.  
  59.     # si no   existe continúa el alta.
  60.     if ( not $existe ) {
  61.         $vgrupos_ref->{ $nombre_grupo } = "x:$gid";     # creamos nuevo grupo
  62.     }
  63. }
  64.  
  65. sub comprobar_grupo {
  66.     my($nombre, $vgrupos_ref) = @_;
  67.  
  68.     return exists $vgrupos_ref->{ $nombre };    # devuelve verdadero si $nombre existe en vgrupos
  69. }
Coloreado en 0.004 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejercicio con hashes y archivos

Notapor olgamc » 2013-09-06 09:11 @424

Muchas gracias por la solución :idea: , me queda muy claro y gracias por explicarlo, despues de las vueltas que estaba dando esta por dejarlo sin terminar.

No sabia que se podia omitir la ruta en la linea 6 y la linea 43 si se ponia así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $archivo = 'etc/group';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tengo una duda de hashes. ¿Cómo almacenaría dos elementos: clave {valor1, valor2}? Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %usuarios = (
  2.     '0' => {'GID','bash'},
  3.     '1' => {'GID','bash'},
  4.     '2' => {'GID','bash'},
  5.     '3' => {'GID','bash'},
  6. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Espero que puedas ayudarme.
Gracias :)
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Re: Ejercicio con hashes y archivos

Notapor explorer » 2013-09-06 19:38 @860

Parafraseando el primer manual de Fortran para los ordenadores Xerox (allá por los años sesenta):

«Aparte de valores cambiantes, uno de los principales propósitos de las variables es darles nombres a las constantes; en vez de tener que escribir en cada ocasión el valor de pi como 3.141592653589793, se puede indicar ese valor a una variable en una instrucción así: my $PI = 3.141592653589793; y usar $PI en lugar de la forma más larga de la constante. Esto también simplifica la modificación del programa, en caso de que el valor de pi cambiase:lol:

Para guardar más de un valor, estamos hablando de listas de elementos, así que, o tenemos variables array o necesitamos arrays anónimos (usando corchetes):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %usuarios = (
  2.     '0' => ['GID','bash'],
  3.     '1' => ['GID','bash'],
  4.     '2' => ['GID','bash'],
  5.     '3' => ['GID','bash'],
  6. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y ya tenemos un hash de arrays.

Más información en tu propio ordenador en perldoc perldsc, y en la Web (traducido al español) (vete a la sección HASHES DE ARRAYS, para que veas un ejemplo con conocidas familias de dibujos animados).
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: Ejercicio con hashes y archivos

Notapor olgamc » 2013-09-09 16:13 @717

Como siempre, mil gracias por la explicación. :D Y también por los enlaces que has puesto (se agradece el que está en español, que en inglés me cuesta un poquito más).
olgamc
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2013-09-04 04:27 @227

Anterior

Volver a Básico

¿Quién está conectado?

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