Cadenas
## Objetivos de Aprendizaje
- Dominar la manipulacion de cadenas
- Usar funciones de cadena
- Trabajar con Unicode
- Formatear cadenas
- Usar here-documents
## Basicos de Cadenas
### Comillas Simples
```perl
use strict;
use warnings;
my $str = 'Hola, Mundo!';
my $escapado = 'Ella dijo \'Hola\''; # Escapar comillas simples
my $barra = 'C:\\Archivos de programa'; # Barra invertida simple
```
### Comillas Dobles
```perl
use strict;
use warnings;
my $nombre = "Alice";
my $saludo = "Hola, $nombre!"; # Interpolacion
my $calc = "2 + 2 = @{[(2+2)]}"; # Expresiones en cadenas
my $array_ref = [1, 2, 3];
my $texto = "Arreglo: @$array_ref"; # Desreferenciar
```
### Operador qq//
```perl
use strict;
use warnings;
# qq{} es cadena de comillas dobles
my $texto = qq{Hola, $nombre!};
# Util para cadenas con comillas
my $html = qq{Clic};
```
## Funciones de Cadena
### length
```perl
use strict;
use warnings;
my $str = "Hola";
print length($str); # 5
# Longitud Unicode
use encoding 'utf8';
my $unicode = "Hola";
print length($unicode); # Puede variar con Unicode
```
### substr
```perl
use strict;
use warnings;
my $str = "Hola, Mundo!";
# substr EXPR, OFFSET, LONGITUD
my $parte = substr($str, 0, 5); # "Hola"
my $parte = substr($str, 7); # "Mundo!"
# Reemplazar en lugar
substr($str, 0, 5) = "Hi"; # "Hi, Mundo!"
```
### index y rindex
```perl
use strict;
use warnings;
my $str = "Hola, Mundo! Hola de nuevo.";
my $pos = index($str, "Mundo"); # 7
my $pos = index($str, "Hola"); # 0 (primera)
my $pos = rindex($str, "Hola"); # 14 (ultima)
# Con posicion inicial
my $pos = index($str, "o", 5); # 8
```
### lc, uc, lcfirst, ucfirst
```perl
use strict;
use warnings;
my $str = "Hola, Mundo!";
print lc($str); # "hola, mundo!"
print uc($str); # "HOLA, MUNDO!"
print lcfirst($str); # "hola, Mundo!"
print ucfirst($str); # "Hola, Mundo!"
```
### capitalize (POSIX)
```perl
use strict;
use warnings;
use POSIX qw(toupper tolower);
my $str = "hola";
# Capitalizar manual
my $cap = ucfirst(lc($str)); # "Hola"
# Usando POSIX
print toupper("a"); # "A"
print tolower("A"); # "a"
```
## Manipulacion de Cadenas
### split
```perl
use strict;
use warnings;
my $linea = "manzana,banana,cereza";
my @frutas = split /,/, $linea; # ("manzana", "banana", "cereza")
# Con limite
my @partes = split /:/, "a:b:c:d", 2; # ("a", "b:c:d")
# Split en espacio en blanco
my $texto = "uno dos tres";
my @palabras = split /\s+/, $texto; # ("uno", "dos", "tres")
```
### join
```perl
use strict;
use warnings;
my @palabras = ("Hola", "Mundo");
my $oracion = join "-", @palabras; # "Hola-Mundo"
my $csv = join ",", @frutas;
```
### chomp y chop
```perl
use strict;
use warnings;
# chomp elimina nueva linea final
my $linea = ;
chomp $linea; # Elimina \n
# chop elimina ultimo caracter
my $str = "Hola";
chop $str; # "Hol"
```
### tr/// (Transliteracion)
```perl
use strict;
use warnings;
my $str = "hola";
$str =~ tr/a-z/A-Z/; # "HOLA"
# Contar
my $count = ($str =~ tr/a//); # Contar 'a's
# Eliminar
my $limpio = $str =~ tr/a-z//cdr; # Eliminar no minusculas
```
## sprintf
```perl
use strict;
use warnings;
# sprintf FORMATO, LISTA
my $formateado = sprintf("%05d", 42); # "00042"
my $formateado = sprintf("%.2f", 3.14159); # "3.14"
my $formateado = sprintf("%10s", "Hola"); # " Hola"
# Multiples valores
my $linea = sprintf("%-10s %5d", "Alice", 30);
```
### Especificadores de Formato
| Especificador | Descripcion |
|---------------|-------------|
| `%d` | Entero |
| `%f` | Flotante |
| `%s` | Cadena |
| `%x` | Hex |
| `%o` | Octal |
| `%b` | Binario |
### Banderas de Formato
```perl
sprintf("%05d", 42); # "00042" (rellenar con ceros)
sprintf("%-10s", "Hi"); # "Hi " (alinear izquierda)
sprintf("%+d", 42); # "+42" (forzar signo)
sprintf("%.3f", 3.14); # "3.140" (precision)
```
## Here-Documents
### Here-Doc Basico
```perl
use strict;
use warnings;
my $texto = <<"FIN";
Esto es un here-document.
Multiples lineas son soportadas.
Variables como $nombre funcionan.
FIN
print $texto;
```
### Here-Doc de Comillas Simples
```perl
use strict;
use warnings;
my $texto = <<'FIN';
Esto NO es interpolado.
$nombre permanece como literal.
FIN
print $texto;
```
### Here-Doc con Identificador Entre Comillas
```perl
use strict;
use warnings;
# Estilo shell (sin comillas)
my $sh_texto = < manzana)
my $resultado = "manzana" cmp "manzana"; # 0 (igual)
# Para ordenar
my @ordenado = sort { $a cmp $b } ("banana", "manzana", "cereza");
```
## Plantillas de Cadenas
### Plantilla con Marcadores
```perl
use strict;
use warnings;
use Template;
my $plantilla = Template->new();
my $vars = { nombre => "Alice", edad => 30 };
$plantilla->process(\ <<'FIN', $vars);
Nombre: [% nombre %]
Edad: [% edad %]
FIN
```
## Rendimiento de Cadenas
### Concatenacion de Cadenas
```perl
use strict;
use warnings;
# Bueno para pocas concatenaciones
my $str = "Hola" . " " . "Mundo";
# Para muchas concatenaciones, usar join
my @partes = ();
for my $i (1 .. 1000) {
push @partes, "Item $i";
}
my $resultado = join "\n", @partes;
```
### String::XS
```perl
# Para operaciones de cadena criticas en rendimiento
use String::XS;
```
## Resumen
- Comillas simples para cadenas literales, comillas dobles interpolan
- `qq{}` es sintaxis alternativa de comillas dobles
- `substr`, `index`, `length` para operaciones basicas
- `split` y `join` para dividir/combinar
- `sprintf` para salida formateada
- Here-documents para cadenas de multiples lineas
- Usar pragma `utf8` para Unicode
- `tr///` para transliteracion de caracteres
- `=~` une regex a cadena
- `s///` para sustitucion, `m//` para coincidencia
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →