75 votes

Perl - pièges Courants?

La question sur les fonctionnalités Cachées de Perl donné au moins une réponse qui pourrait être considéré comme une fonctionnalité ou d'une mauvaise fonction. Il semblait logique de faire un suivi avec cette question: quelles sont les communes non-erreurs évidentes en Perl? Les choses qui semblent comme ils auraient à travailler, mais ne le font pas.

Je ne vais pas donner des directives sur la manière de structurer des réponses, ou de ce qui est "trop facile" pour être considéré comme un piège, puisque c'est ce que le vote est pour.

Table de Réponses

La syntaxe

La Sémantique De La Langue/Fonctionnalités

Débogage

Les Meilleures Pratiques

Méta-Réponses

Voir Aussi: ASP.NET - pièges Courants

38voto

Adam Bellaire Points 42797

Le fait que les guillemets simples peuvent être utilisés pour remplacer :: dans les identificateurs.

Considérer:

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

Menant à la problématique suivante:

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

La méthode recommandée pour éviter cela est d'utiliser des accolades autour de votre nom de la variable:

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

Et aussi pour use warnings, car il va vous parler de l'utilisation de la variable indéfinie $name::s

28voto

dland Points 2033

Vous pouvez imprimer sur un descripteur de fichier lexical: bonne.

print $out "hello, world\n";

Tu te rends alors compte qu'il pourrait être agréable d'avoir un hachage de descripteurs:

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: $!";

Pour l'instant, donc bon. Maintenant, essayez de les utiliser et de les imprimer à l'un ou l'autre, selon une condition:

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

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

Vous devez envelopper la valeur de hachage de déréférencement dans une paire de curlies:

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

C'est complètement non-intuitive du comportement. Si vous n'avez pas entendu parler de cela, ou le lire dans la documentation, je doute que vous pourriez figure it out sur votre propre.

28voto

pjf Points 4685

C'est un méta-réponse. Beaucoup de méchant pièges sont pris en Perl::Critic, vous pouvez l'installer et l'exécuter à partir de la ligne de commande avec l' perlcritic de commande, ou (si vous êtes heureux de vous envoyer votre code sur Internet, et ne pas être en mesure de personnaliser vos options) via le Perl::Critic site web.

Perl::Critic fournit également des références à Damian Conways Perl Best Practices livre, y compris les numéros de page. Donc, si vous êtes trop paresseux pour lire le livre en entier, Perl::Critic pouvez encore vous dire les bits que vous devriez lire.

18voto

Michael Carman Points 21983

Perl DWIMmer les luttes << (ici-document) la notation lors de l'utilisation d' print avec lexicale descripteurs:

# 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 solution consiste à être attentif à inclure l'espace entre le descripteur et l' << ou de lever l'ambiguïté sur le descripteur de fichier en l'enveloppant dans {} des accolades:

print {$fh}<<EOT;
foo
EOT

16voto

Michael Carman Points 21983

Le perltrap page de manuel répertorie de nombreux pièges pour les imprudents organisé par type.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X