• Publicidad

Explicación de código sencillo

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

Explicación de código sencillo

Notapor DC_13 » 2015-10-14 11:07 @504

:evil: Buenas a todos, llevo intentado entender un trozo de código (me estoy iniciando en Perl), y por más que busco sigo sin entenderlo.

El código es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for ( $i = 0; $i <= $contador; $i++ ) {
  2.     push @{ $xml->{alumno} },
  3.         {
  4.         nombre => [ $registro[$i][0] ],
  5.         fecha  => [ $registro[$i][1] ],
  6.         };
  7. }
  8. XMLout( $xml, RootName => $curso, Outputfile => $fichero )
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Dudas:
  1. he visto el significado de push() que se utiliza para meter datos en un array. Por ejemplo, push(@vector, $datos), pero no entiendo la sintaxis de este código. Utiliza la '@' seguida del llave '{}'. No entiendo cuál es el vector y cuáles son los datos
  2. sé que está creando una estructura, entiendo la línea del nombre, la fecha, pero no entiendo lo del push(). Utiliza llaves, y en alumno utiliza el operador ->
A ver si me lo podéis explicar, porque entiendo lo que quiere hacer, pero no entiendo las reglas de sintaxis, y eso que he estado mirando en Google pero no encuentro nada parecido a mi caso.

Un saludo y gracias.
Última edición por explorer el 2015-10-14 14:51 @660, editado 1 vez en total
Razón: Formateado de código con Perltidy; Marcas Perl
DC_13
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-10-14 10:52 @494
Ubicación: Valladolid, España (Pucela)

Publicidad

Re: Explicación de código sencillo

Notapor explorer » 2015-10-14 15:45 @698

Bienvenido a los foros de Perl en Español, DC_13.

Lo que primero vemos es $xml->{alumno}.

Quiere decir que $xml contiene una referencia a un hash. Y que una de las claves de ese hash es 'alumno'. Entonces $xml->{alumno} nos devuelve el valor asociado a esa clave.

Y ese valor, ¿qué es?

@{ ... } nos da la pista. Se trata de una desreferencia. Está explicado en perlreftut:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Usando referencias

    ¿Qué puede hacer con una referencia una vez que la tiene?  Es un valor escalar,
    y hemos visto que puede almacenarse como un escalar y recuperarlo como cualquier
    otro escalar.  Hay otras dos formas de usarlas:

    Regla de uso 1

      Siempre puede usar una referencia de array, entre llaves, en lugar del nombre de
      un array. Por ejemplo, @{$aref} en lugar de @array.

    A continuación, algunos ejemplos de cómo usarlos:

    Arrays:

        @a    @{$aref}      Un array
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Así que... $xml->{alumno} devuelve una referencia a un array, y lo desreferenciamos con @{ ... }. Así que lo que obtenemos es acceso directo al array, que es justo lo que le pasamos a push().

Lo que metemos en ese array es... un hash anónimo (por la presencia de las llaves). Es hash tiene dos pares clave/valor. Y los valores son arrays anónimos (por la presencia de los corchetes), que contienen un único elemento: el valor escalar extraído de una matriz bidimensional llamada @registro.

Entonces, la estructura que está construyendo es (de forma esquemática):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    $xml -> {
        'alumno' => [
            {                                       # $xml -> {'alumno'}[0]
                nombre => [
                    $registro[$i][0],               # $xml -> {'alumno'}[0]{'nombre'}[0]
                    ...,                            # $xml -> {'alumno'}[0]{'nombre'}[1] ... {'alumno'}[0]{'nombre'}[N]
                ],
                fecha  => [
                    $registro[$i][1],               # $xml -> {'alumno'}[0]{'fecha'}[0]
                    ...,                            # $xml -> {'alumno'}[0]{'fecha'}[1] ... {'alumno'}[0]{'fecha'}[M]
                ],
            },
            ...,                                    # $xml -> {'alumno'}[1]
        ],
        ...,                                        # otras claves
    }
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Te aconsejo que mires perlref y perlreftut (con perldoc, por ejemplo).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Explicación de código sencillo

Notapor DC_13 » 2015-10-15 02:13 @134

Muchas gracias, explorer, un verdadero placer.

Ya me dirás cómo lo haces para saber tanto. :D

Un saludo paisano, que yo también soy de Valladolid.
DC_13
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-10-14 10:52 @494
Ubicación: Valladolid, España (Pucela)


Volver a Básico

¿Quién está conectado?

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

cron