← Perl EspañolChapter 13 of 13

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 →