• Publicidad

Cómo funcionan estas líneas de código

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

Cómo funcionan estas líneas de código

Notapor n3td1srupt » 2013-07-29 02:27 @143

Hola, Foro, veréis, quiero entender la sintaxis de estas líneas dado que, no me resultan confusas, sino que quería ver si estoy en lo cierto de lo que significan. Las líneas son estas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach my $file (@ARGV) {
  2.   my $fh;
  3.   unless (open $fh, $file) {
  4.     warn "$0: open $file: $!";
  5.     next;
  6.   }
  7.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Bueno, a mi parecer, el significado que doy es este:

  1. En primer lugar con foreach se recorre cada elemento de la matriz ARGV que contiene los parámetros pasados al script (supongo que la variable $file guardará en cada iteración un elemento de la matriz, pero no entiendo el por qué la declaración con my, y tampoco el por qué del uso de la variable)
  2. Donde me pierdo es en el FILEHANDLE especificado en open(). Sé que se puede usar una EXPR en lugar de darle un nombre a FILEHANDLE pero no entiendo el uso de la variable $fh, además de que ésta también está definida con my pero no está declarada, por lo tanto ¿su valor en cada iteración no sería el mismo? Yo pienso que la variable $fh en cada iteración y para cada archivo creaba un descriptor de archivo con un nombre diferente y que era ese su uso, pero de ello no estoy seguro.
Gracias por la ayuda, ¡ espero que me corrijan !
n3td1srupt
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2012-10-28 15:13 @675

Publicidad

Re: Cómo funcionan estas líneas de código

Notapor explorer » 2013-07-29 05:47 @282

    able será local en el contexto donde se usa (el grupo de llaves más interno). Fuera de ese contexto, la variable no es conocida (desaparece). No es más que eso: declarar variables locales. En el caso del foreach(), es para tener una variable local que recorra los valores de los elementos de @ARGV. Vemos que se usa en el open(), en la línea 3
  1. Es recomendable el uso de variables como gestores de archivo. Tienen ventajas frente a los identificadores tradicionales (una palabra simple, como por ejemplo, FILEHANDLE). Por lo demás, tienen el mismo uso y función. El valor que obtiene es el gestor de archivo al abrir $file, cuando se ejecuta el open(), así que tu suposición es cierta.
Lo que hace el trozo de código, es probar a abrir todos los archivos indicados por @ARGV. Si alguno falla, hace el warn(), y pasa al siguiente.

En perldoc perlopentut, sección Indirect Filehandles, lo tienes explicado, y las ventajas de usar variables como gestores de archivo.
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: Cómo funcionan estas líneas de código

Notapor n3td1srupt » 2013-07-29 09:15 @427

Gracias, explorer, entonces ¿la variable $fh dará un nombre de descriptor de archivo según el nombre del archivo a abrir? ¿Sería, así? ¡ Por qué en tal caso es realmente muy útil !

Me leeré la documentación que me has aportado sobre el tema, ¡ gracias !
n3td1srupt
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2012-10-28 15:13 @675

Re: Cómo funcionan estas líneas de código

Notapor explorer » 2013-07-29 10:45 @489

No exactamente. Lo que ocurre es que open() crea el gestor de archivo y lo guarda en la variable.

La ventaja es que puedes, por ejemplo, abrir 10 archivos diferentes, y guardar los gestores de archivo de cada de uno de ellos en un array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @fh;
  2.  
  3. for my $i (0 .. 9) {
  4.     open my $fh[$i], '<', "archivo$i.txt";
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Luego, podemos usarlos para imprimir a cada archivo, de forma selectiva:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     print $fh[2] $info;    # imprime $info al tercer archivo abierto
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Naturalmente, luego hay que cerrarlos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i (0 .. 9) {
  2.     close $fh[$i];
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

aunque... una de las ventajas de guardar los gestores así, es que los archivos se cerrarán de forma automática cuando se termine el contexto en donde se definieron.
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


Volver a Básico

¿Quién está conectado?

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