• Publicidad

Diario de aprendizaje de un perlero desde cero

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

Notapor Zeokat » 2007-07-29 14:12 @633

Bueno.... no termino de ver lo que dices creating... :roll:

Seguimos con los ejercicos. :lol:
Última edición por Zeokat el 2007-07-29 18:53 @828, editado 1 vez en total
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor Zeokat » 2008-07-27 11:44 @530

Tras un tiempo ocupado con otras cosas, continúo. :)

Tengo un par de dudas, antes de empezar:

¿Qué diferencia hay entre las comillas simples y las comillas dobles?

Por ejemplo, a la hora de declarar una variable
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $variable = "@palabra"; #esto da error
my $variable = '@palabra'; #no da error
#¿Por qué?
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Ahora tengo problemas con los array (matrices). Hasta ahora siempre usé array unidimensionales o listas. Pero ahora necesito trabajar con array de varias dimensiones, en principio bidimensionales.

Las primeras dudas están en el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use diagnostics;

#¿Una matriz con valores predefinidos se declara así?
my @matriz = (["uno-uno", "uno-dos", "uno-tres"],
              ["dos-uno", "dos-dos", "dos-tres"],
              ["tres-uno", "tres-dos", "tres-tres"]);


print $matriz[1][2], "\n"; #Esto imprime correctamente

print @matriz , "\n"; #¿Qué imprime esto?
print $matriz[1] , "\n"; #Y esto ¿qué imprime?

#¿Se declara así una matriz de tres filas vacías?
#¿Declaro con los corchetes el número de filas?
my @matriz2 =([],[],[]);

#¿Cómo añado por ejemplo la variable "salami" en la posición (0,1) de @matriz2?
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-07-27 14:05 @629

La diferencia entre las comillas simples y dobles se comenta varias veces en este sitio. Por ejemplo, en el último comentario de este hilo.

En cuanto a las dudas que tienes con el segundo programa, lo mejor es ejecutarlo, claro. :)

Para imprimir estructuras más allá de los tipos simples, lo recomendable es usar Data::Dumper.

En Perl no se declara, a priori, el tamaño que van a ocupar los array.

La documentación relacionada con esto la tienes en perldata , perllol, y el tutorial perldsc.

En cuanto a la última pregunta, lo debes hacer como lo has dicho:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$matriz2[0][1] = 'salami';
Coloreado en 0.001 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-07-27 18:15 @802

Cuando preguntaba qué imprimía, evidentemente ya había ejecutado el script, pero como salían cosas extrañas a la hora de imprimir, pues tenía curiosidad por saber qué era eso... direcciones de memoria... o quién sabe... :roll:

Escribí unas líneas tras echar un ojo por encima a los links facilitados por explorer, con la documentación.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use diagnostics;

my @matriz = ([1, 5, 1],
              [0, 1, 1],
              [9, 4, 2]);

my @matriz1 = ([2, 2, 3],
              [0, 8, 8],
              [1, 3, 7]);

my @matriz_suma =([],[],[]);

#Sumar dos elementos directamente.
print $matriz[0][1] + $matriz1[0][0],"\n";


print @{$matriz[0]},"\n"; #Imprime una fila (empezando a contar en 0).
print $#matriz,"\n\n"; #Me devuelve el numero de filas
print $#{$matriz[0]},"\n"; #Me devuelve el numero de columnas


#Suma  @matriz + @matriz1
for my $i ( 0 .. $#matriz ) {
    for my $j ( 0 .. $#{$matriz[$i]} ) {
        my $suma = $matriz[$i][$j] + $matriz1[$i][$j];
        $matriz_suma[$i][$j] = $suma;
    }
}

#Imprime una matriz por filas, en este caso la matriz suma.
for my $i ( 0 .. $#matriz_suma ) {
    print @{$matriz_suma[$i]} ,"\n";
}

#Imprime una matriz elemento a elemento.
for my $i ( 0 .. $#matriz_suma ) {
    for my $j ( 0 .. $#{$matriz_suma[$i]} ) {
        print $matriz_suma[$i][$j]," | ";
    }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Quizás haya cosas que se hagan de una forma más sencilla e incluso más rápida y cómoda. El Data::Dumper no lo usé y quizás me hubiese simplificado las cosas :?
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-07-27 19:18 @845

Yo veo bien todo lo que haces.

Solo dos detalles:
* No es necesario que inicialices la variable @matriz_suma. Perl construirá la estructura a medida de que vayas indicando cómo es
* Una cosa es pintar una fila con esta forma
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print @{$matriz_suma[$i]} ,"\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
que con esta otra forma
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "@{$matriz_suma[$i]}\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En la segunda forma, estás indicando una interpolación de las variables (por efecto de las dobles comillas), por lo que Perl desarmará el array que encuentra ahí, pero usando como valor de separador el valor de la variable especial $" (ver perlvar).

Pruébalo. Notarás la diferencia.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

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

cron