Variables
## Objetivos de Aprendizaje
- Comprender los tipos de variables en Perl
- Trabajar con variables escalares
- Usar arreglos y listas
- Usar hashes (arreglos asociativos)
- Comprender referencias
- Trabajar con typeglobs
## Tipos de Variables
| Tipo | Prefijo | Ejemplo |
|------|---------|---------|
| Escalar | `$` | `$nombre`, `$edad` |
| Arreglo | `@` | `@nombres`, `@numeros` |
| Hash | `%` | `%datos`, `%config` |
| Typeglob | `*` | `*archivo` |
| Referencia | `\` | `\$escalar`, `\@arreglo` |
## Variables Escalares
### Declaracion y Asignacion
```perl
use strict;
use warnings;
my $nombre; # Declaracion
$nombre = "Alice"; # Asignacion
my $edad = 30; # Declaracion + Inicializacion
my $precio = 19.99; # Punto flotante
my $cuenta = undef; # Valor indefinido
```
### Escalares de Cadena
```perl
my $nombre = "Alice";
my $saludo = 'Hola'; # Comillas simples - sin interpolacion
my $mensaje = "Hola, $nombre!"; # Comillas dobles - interpolacion
my $escapado = "Ella dijo \"Hola\""; # Caracteres de escape
my $concat = "Hola " . "Mundo"; # Concatenacion
```
### Escalares Numericos
```perl
my $entero = 42;
my $flotante = 3.14;
my $cientifico = 1.5e10;
my $hex = 0xFF; # Hexadecimal (255)
my $octal = 0777; # Octal
my $binario = 0b1010; # Binario (10)
```
### Valores Undef
```perl
my $indefinido;
print defined($indefinido) ? $indefinido : "indefinido";
$indefinido = 5;
print defined($indefinido) ? $indefinido : "indefinido";
```
## Variables de Arreglo
### Declaracion
```perl
use strict;
use warnings;
my @numeros; # Arreglo vacio
my @nums = (1, 2, 3, 4, 5); # Arreglo con valores
my @mixed = ("a", 1, "b", 2); # Tipos mixtos
my @rango = (1 .. 10); # Operador de rango (1 a 10)
my @letras = ('a' .. 'z'); # Rango de letras
```
### Operaciones con Arreglos
```perl
my @colores = ("rojo", "verde", "azul");
# Acceder a elementos (indice base 0)
print $colores[0]; # "rojo"
print $colores[-1]; # "azul" (ultimo elemento)
# Longitud del arreglo
print scalar @colores; # 3
print $#colores; # 2 (ultimo indice)
# Asignacion
$colores[3] = "amarillo"; # Agregar elemento
$colores[0] = "purpura"; # Modificar elemento
```
### Rebanadas de Arreglos
```perl
my @nums = (1 .. 10);
my @primeros_tres = @nums[0, 1, 2]; # (1, 2, 3)
my @rebanada = @nums[2 .. 5]; # (3, 4, 5, 6)
```
### Push, Pop, Shift, Unshift
```perl
my @pila = (1, 2, 3);
push @pila, 4; # (1, 2, 3, 4)
my $sacado = pop @pila; # Remueve 4, retorna 4
unshift @pila, 0; # (0, 1, 2, 3)
my $desplazado = shift @pila; # Remueve 0, retorna 0
```
## Variables Hash
### Declaracion de Hash
```perl
use strict;
use warnings;
my %vacio; # Hash vacio
my %persona = (
nombre => "Alice",
edad => 30,
ciudad => "Boston"
);
# El orden no esta garantizado (pre Perl 5.26)
```
### Accediendo a Elementos
```perl
my %persona = (
nombre => "Alice",
edad => 30,
ciudad => "Boston"
);
print $persona{nombre}; # "Alice"
print $persona{edad}; # 30
# Modificar
$persona{edad} = 31;
$persona{email} = "alice@example.com";
```
### Funciones de Hash
```perl
my %persona = (nombre => "Alice", edad => 30);
# Claves y valores
my @claves = keys %persona; # ("nombre", "edad")
my @valores = values %persona; # ("Alice", 30)
# each (iteracion)
while (my ($clave, $valor) = each %persona) {
print "$clave => $valor\n";
}
# Verificar existencia
if (exists $persona{edad}) {
print "La edad existe\n";
}
# Eliminar
delete $persona{edad};
# Tamano
my $tamano = scalar keys %persona; # Numero de claves
```
## Referencias
### Creando Referencias
```perl
my $escalar = 42;
my @arreglo = (1, 2, 3);
my %hash = (a => 1, b => 2);
my $ref_escalar = \$escalar;
my $ref_arreglo = \@arreglo;
my $ref_hash = \%hash;
# Referencias anonimas
my $arreglo_anon = [1, 2, 3];
my $hash_anon = { a => 1, b => 2 };
```
### Desreferenciando
```perl
my @colores = ("rojo", "verde", "azul");
my $colores_ref = \@colores;
# Desreferenciar para obtener el original
my @copia = @$colores_ref;
my $primero = $colores_ref->[0];
my %datos = (x => 10, y => 20);
my $datos_ref = \%datos;
my %copia = %$datos_ref;
my $val = $datos_ref->{x};
```
### Referencia a Funciones
```perl
sub saludar {
my ($nombre) = @_;
print "Hola, $nombre!\n";
}
my $saludar_ref = \&saludar;
$saludar_ref->("Alice");
```
## Estructuras de Datos Complejas
```perl
use strict;
use warnings;
use Data::Dumper;
# Arreglo de hashes
my @usuarios = (
{ nombre => "Alice", edad => 30 },
{ nombre => "Bob", edad => 25 },
);
print $usuarios[0]{nombre}; # "Alice"
# Hash de arreglos
my %puntuaciones = (
Alice => [95, 87, 92],
Bob => [88, 91, 85],
);
print $puntuaciones{Alice}[0]; # 95
# Referencia profunda
my $complejo = {
usuarios => [
{ nombre => "Alice", puntuaciones => [95, 87] },
],
};
print $complejo->{usuarios}[0]{puntuaciones}[0]; # 95
```
## Typeglobs
### Uso Basico
```perl
use strict;
use warnings;
my $escalar = "hola";
my @arreglo = (1, 2, 3);
# Typeglob - acceder a todos los tipos con el mismo nombre
print *$escalar; # "hola"
print *$arreglo[0]; # 1
# Crear alias
*otro_nombre = \$escalar;
print $otro_nombre; # "hola"
```
### Typeglob de Filehandle
```perl
use strict;
use warnings;
# STDOUT es un typeglob
print STDOUT "Hola\n";
print STDERR "Error\n";
```
## Alcance de Variables
```perl
use strict;
use warnings;
my $global = "externo";
{
my $interno = "alcance interno";
print $global; # Accesible
print $interno; # Accesible
}
# print $interno; # Error - fuera de alcance
```
## Resumen
- Las variables escalares (`$`) contienen valores simples
- Las variables de arreglo (`@`) contienen listas ordenadas
- Las variables hash (`%`) contienen pares clave-valor
- Las referencias (`\`) crean punteros a variables
- Usa `->` para acceder a datos referenciados
- Los arreglos anonimos usan `[ ]`, los hashes usan `{ }`
- `my` crea variables lexicas (con alcance)
- Siempre usa `use strict` y `use warnings`
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →