Mejores Practicas
## Objetivos de Aprendizaje
- Escribir codigo Perl mantenible
- Usar strict y warnings
- Dominar tecnicas de depuracion
- Aplicar practicas de pruebas
- Seguir convenciones
## Pragmas Esenciales
### Siempre Usar strict
```perl
use strict;
# Obliga a:
# - Declaracion de variable (my/our)
# - Calificacion de paquete para globales
# - Proteccion de palabras desnudas
my $var = "test";
# $nodeclarada = "error"; # Daria error
```
### Siempre Usar warnings
```perl
use warnings;
# Advierte sobre:
# - Usar valores undef
# - Filehandles de palabras desnudas
# - Sombreado de palabras clave
# - etc.
```
### Combinado
```perl
use strict;
use warnings;
# O combinado
use strictures 2; # Equivalente a strict + warnings (CPAN)
```
### Requerimiento de Version
```perl
use 5.014; # Version minima de Perl
use 5.010; # Habilitar caracteristicas como given/when
```
## Declaracion de Variables
### Usar my y our
```perl
use strict;
use warnings;
# Variables lexicas (con alcance)
my $local = "con alcance";
# Variables de paquete (globales)
our $global = "de todo el paquete";
# Siempre declarar antes de usar
```
### Inicializar Variables
```perl
use strict;
use warnings;
my $conteo = 0; # Inicializar a valor conocido
my @items = (); # Arreglo vacio
my %datos = {}; # Hash vacio
# Evitar undef donde sea posible
```
## Convenciones de Nomenclatura
### Nombres de Variables
```perl
use strict;
use warnings;
# snake_case para variables y funciones
my $primer_nombre = "Alice";
sub calcular_total { }
# Nombres descriptivos
my $conteo_usuarios = 0;
my $es_valido = 1;
# Evitar letras simples (excepto $_ o vars comunes de bucle)
my $i; # OK para bucles simples
```
### Nombres de Paquetes
```perl
# Usar letras mayusculas para paquetes
package Mi::Modulo;
package Data::Processor;
# Version con $VERSION
our $VERSION = "1.00";
```
## Diseno de Codigo
### Indentacion
```perl
use strict;
use warnings;
if ($condicion) {
hacer_algo();
if ($otra) {
hacer_otro();
}
}
```
### Longitud de Linea
```perl
# Mantener lineas alrededor de 80 caracteres
my $nombre_variable_muy_largo = alguna_funcion(
argumento1 => $valor,
argumento2 => $otro_valor,
);
```
## Manejo de Errores
### die para Errores Fatales
```perl
use strict;
use warnings;
open my $fh, "<", "archivo.txt" or die "No se puede abrir: $!";
```
### eval para Errores Recuperables
```perl
use strict;
use warnings;
eval {
operacion_peligrosa();
};
if ($@) {
warn "Error: $@";
# Manejar gracefulmente
}
```
### Pragma autodie
```perl
use strict;
use warnings;
use autodie;
# Muere automaticamente en caso de falla
open my $fh, "<", "archivo.txt"; # Muere si falla
```
## Referencias
### Siempre Desreferenciar Correctamente
```perl
use strict;
use warnings;
my $arr_ref = [1, 2, 3];
# Desreferenciar correctamente
my @arr = @$arr_ref;
my $primero = $arr_ref->[0];
my $hash_ref = { a => 1 };
my %hash = %$hash_ref;
my $val = $hash_ref->{a};
```
### Evitar Referencias Simbolicas
```perl
use strict;
use warnings;
my $var = "hola";
# Mal - referencia simbolica (bloqueada por strict)
# print ${"var"}; # Error con strict
# Bien - referencia directa
print $var;
```
## Subrutinas
### Parametros Nombrados
```perl
use strict;
use warnings;
sub crear_usuario {
my %args = @_;
my $nombre = $args{nombre} // "Anonimo";
my $edad = $args{edad} // 0;
# ...
}
crear_usuario(nombre => "Alice", edad => 30);
```
### Retornos Tempranos
```perl
sub procesar {
my ($datos) = @_;
return unless defined $datos;
return if $datos eq "";
# Procesamiento principal
}
```
## Filehandles
### Filehandles Lexicos
```perl
use strict;
use warnings;
# Siempre usar filehandles lexicos
open my $fh, "<", "archivo.txt" or die "No se puede abrir: $!";
# ...
close $fh;
# Con autodie
use autodie;
open my $fh, "<", "archivo.txt";
```
## Expresiones Regulares
### Usar /x para Patrones Complejos
```perl
use strict;
use warnings;
# Regex legible
if ($fecha =~ /
(\d{4}) # Ano
- # Guion
(\d{2}) # Mes
- # Guion
(\d{2}) # Dia
/x) {
print "Ano: $1\n";
}
```
### Compilar Regexes
```perl
use strict;
use warnings;
my $patron = qr/\d{3}-\d{4}/;
if ($texto =~ $patron) {
print "Coincidencia!\n";
}
```
## Pruebas
### Pruebas Basicas
```perl
use strict;
use warnings;
sub sumar {
my ($a, $b) = @_;
return $a + $b;
}
# Probar
my $resultado = sumar(2, 3);
die "Fallo" unless $resultado == 5;
```
### Test::More
```perl
use strict;
use warnings;
use Test::More;
sub sumar {
my ($a, $b) = @_;
return $a + $b;
}
is(sumar(2, 3), 5, "sumar(2,3) retorna 5");
is(sumar(0, 0), 0, "sumar(0,0) retorna 0");
done_testing();
```
## Documentacion
### Documentacion POD
```perl
use strict;
use warnings;
=head1 NOMBRE
Mi::Modulo - Breve descripcion
=head1 SINOPSIS
use Mi::Modulo;
my $obj = Mi::Modulo->new();
=head1 DESCRIPCION
Descripcion larga...
=cut
```
## Depuracion
### Depuracion con print
```perl
use strict;
use warnings;
use Data::Dumper;
my @datos = (1, 2, 3);
print Dumper(\@datos);
warn "Depurar: $variable";
```
### Smart::Comments
```perl
use strict;
use warnings;
use Smart::Comments;
my $resultado = procesar();
### Depurar: $resultado
### Esperado: 42
```
### Devel::NYTProf
```bash
# Perfil de rendimiento
perl -d:NYTProf script.pl
nytprofhtml
```
## Seguridad
### Verificacion de Taint
```perl
#!/usr/bin/perl -T
use strict;
use warnings;
# $ARGV[0] esta contaminado
my $entrada = $ARGV[0];
# Debe desinfectar
if ($entrada =~ /^(\w+)$/) {
my $seguro = $1; # Ahora es seguro
}
```
### Validacion de Entrada
```perl
use strict;
use warnings;
# Validar email
sub es_email_valido {
my ($email) = @_;
return $email =~ /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
}
# Validar numero
sub es_numero_valido {
my ($num) = @_;
return defined $num && $num =~ /^\d+$/;
}
```
## Rendimiento
### Evitar Variables Globales
```perl
use strict;
use warnings;
# Mal - global
our $Contador_Global = 0;
# Bien - lexica
my $contador = 0;
```
### Estructuras de Datos Eficientes
```perl
use strict;
use warnings;
# Usar hashes para busquedas
my %busqueda = map { $_->{id} => $_ } @objetos;
```
### Memoizacion
```perl
use strict;
use warnings;
use Memoize;
sub costoso {
my ($n) = @_;
# ...
}
memoize('costoso');
```
## Perl Moderno
### Usar Caracteristicas Modernas
```perl
use strict;
use warnings;
use 5.014;
# Given/when
given ($valor) {
when (/^\d+$/) { say "Numero" }
default { say "Otro" }
}
# Variables de estado
sub contador {
state $conteo = 0;
return ++$conteo;
}
```
### Modulos CPAN
```perl
# Alternativas modernas
use Path::Tiny qw(path); # En lugar de File::Spec
use JSON qw(to_json from_json); # En lugar de JSON::PP
use Try::Tiny; # En lugar de eval/die
```
## Resumen
- Siempre usar `strict` y `warnings`
- Declarar variables con `my` o `our`
- Usar nombres de variables significativos
- Manejar errores apropiadamente (die, eval, autodie)
- Usar filehandles lexicos
- Compilar regexes cuando se usan multiples veces
- Escribir pruebas con Test::More
- Documentar codigo con POD
- Validar toda la entrada
- Usar caracteristicas de Perl moderno cuando beneficien
- Usar modulos CPAN para tareas comunes
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →