Pregunta ¿Cosas comunes para Perl? [cerrado]


La pregunta sobre Características ocultas de Perl cedió al menos una respuesta eso podría considerarse como una función o una función incorrecta. Parecía lógico continuar con esta pregunta: ¿cuáles son los errores no obvios comunes en Perl? Las cosas que parecen que deberían funcionar, pero no es así.

No daré pautas sobre cómo estructurar las respuestas, o qué es "demasiado fácil" para que se lo considere una basura, ya que para eso es la votación.

Tabla de respuestas

Sintaxis

Semántica / Características del lenguaje

Depuración

Mejores prácticas

Meta-respuestas

Ver también: ASP.NET - errores comunes


74
2017-10-03 12:51


origen


Respuestas:


El hecho de que las comillas simples se pueden usar para reemplazar :: en identificadores.

Considerar:

use strict;
print "$foo";        #-- Won't compile under use strict
print "$foo's fun!"; #-- Compiles just fine, refers to $foo::s

Conduciendo al siguiente problema:

use strict;
my $name = "John";
print "$name's name is '$name'";
# prints:
#  name is 'John'

La forma recomendada de evitar esto es utilizar llaves alrededor de su nombre de variable:

print "${name}'s name is '$name'";
# John's name is 'John'

Y también a use warnings, ya que te informará sobre el uso de la variable indefinida $name::s


37
2017-10-03 14:25



Puede imprimir en un manejador de archivo léxico: bueno.

print $out "hello, world\n";

A continuación, te das cuenta de que podría ser bueno tener un hash de filehandles:

my %out;
open $out{ok},   '>', 'ok.txt' or die "Could not open ok.txt for output: $!";
open $out{fail}, '>', 'fail.txt' or die "Could not open fail.txt for output: $!";

Hasta aquí todo bien. Ahora intente usarlos, e imprima en uno u otro según una condición:

my $where = (frobnitz() == 10) ? 'ok' : 'fail';

print $out{$where} "it worked!\n"; # it didn't: compile time error

Tienes que ajustar la desreferencia de hash en un par de curlies:

print {$out{$where}} "it worked!\n"; # now it did

Este es un comportamiento completamente no intuitivo. Si no lo escuchó o lo leyó en la documentación, dudo que lo pueda resolver por su cuenta.


28
2017-10-04 00:45



Esta es una meta-respuesta. Muchos atracones desagradables son atrapados por Perl :: Crítica, que puede instalar y ejecutar desde la línea de comando con el perlcritic comando, o (si está contento de enviar su código a través de Internet, y no puede personalizar sus opciones) a través del Perl :: Critic sitio web.

Perl::Critic también proporciona referencias a Damian Conways Mejores prácticas de Perl libro, incluidos los números de página. Entonces, si eres demasiado flojo para leer todo el libro, Perl::Critic todavía puede decirte los bits que debería estar leyendo.


26
2017-10-03 15:11



DWIMmer de Perl lucha con << (Aquí-documento) notación cuando se utiliza print con manejadores de archivos léxicos:

# here-doc
print $fh <<EOT;
foo
EOT

# here-doc, no interpolation
print $fh <<'EOT';
foo
EOT

# bitshift, syntax error
# Bareword "EOT" not allowed while "strict subs" in use
print $fh<<EOT;
foo
EOT

# bitshift, fatal error
# Argument "EOT" isn't numeric...
# Can't locate object method "foo" via package "EOT"...
print $fh<<'EOT';
foo
EOT

La solución es tener cuidado de incluir espacios en blanco entre Filehandle y el << o para desambiguar el identificador de archivo envolviéndolo en {} tirantes:

print {$fh}<<EOT;
foo
EOT

18
2017-10-03 21:06



los perltrap la página de manual enumera muchas trampas para los incautos organizadas por tipo.


17
2017-10-03 12:59



Asignar matrices a escalares no tiene sentido para mí. Por ejemplo:

$foo = ( 'a', 'b', 'c' );

Asigna 'c' a $ foo y arroja el resto de la matriz. Este es más raro:

@foo = ( 'a', 'b', 'c' );
$foo = @foo;

Parece que debería hacer lo mismo que el primer ejemplo, pero en su lugar establece $foo al longitud de @foo, asi que $foo == 3.


15
2017-10-03 12:55



El problema más común es comenzar sus archivos con algo diferente a

use strict;
use diagnostics;

pjf agrega: se advirtió que el diagnóstico tiene una significativo impacto en el rendimiento Se ralentiza la puesta en marcha del programa, ya que necesita cargar perldiag.pod, y hasta bleadperl desde hace unas semanas, también ralentiza e hincha las expresiones regulares porque usa $ &. Usando advertencias y corriendo splain en los resultados es recomendado.


15
2017-10-03 12:58



Referencias confusas y objetos reales:

$a = [1,2,3,4];
print $a[0];

(Debe ser uno de $a->[0] (mejor), $$a[0], @{$a}[0] o @$a[0])


15
2017-10-06 17:07



"mis" declaraciones deben usar paréntesis alrededor de listas de variables

use strict;
my $a = 1;
mysub();
print "a is $a\n";

sub {
    my $b, $a;   # Gotcha!
    $a = 2;
}

Imprime a es 2 porque el my declaración solo se aplica a $b (la mención de $a en esa línea simplemente no hizo nada). Tenga en cuenta que esto sucede sin previo aviso, incluso cuando está en uso "use strict".

Agregar "usar advertencias" (o la bandera -w) mejora las cosas mucho con Perl diciendo Paréntesis falta alrededor de "mi" lista. Esto muestra, como muchos ya lo han hecho, por qué tanto los pragmas estrictos como los de advertencia son siempre una buena idea.


14
2017-10-06 17:24