143 votes

Fonctions cachées de Perl ?

Quelles sont les fonctionnalités vraiment utiles mais ésotériques du langage Perl que vous avez pu utiliser pour faire un travail utile ?

Directives :

  • Essayez de limiter les réponses au noyau Perl et non au CPAN.
  • Veuillez donner un exemple et une brève description

Fonctions cachées que l'on retrouve également dans les fonctions cachées d'autres langues :

(Ils sont tous issus de La réponse de Corion )

  • C
    • Dispositif de Duff
    • Portabilité et standardisation
  • C#
    • Citations pour les listes et chaînes de caractères délimitées par des espaces blancs
    • Espaces de noms aliasables
  • Java
    • Initaliseurs statiques
  • JavaScript
    • Les fonctions sont des citoyens de première classe
    • Portée et fermeture du bloc
    • Appeler des méthodes et des accesseurs indirectement à travers une variable
  • Ruby
    • Définir les méthodes par le code
  • PHP
    • Une documentation en ligne omniprésente
    • Méthodes magiques
    • Références symboliques
  • Python
    • Échange de valeurs sur une ligne
    • Possibilité de remplacer même les fonctions de base par votre propre fonctionnalité.

Autres caractéristiques cachées :

Opérateurs :

Citer des constructions :

Syntaxe et noms :

Modules, pragmatiques et options de ligne de commande :

Variables :

Boucles et contrôle de flux :

Les expressions régulières :

Autres caractéristiques :

Autres astuces, et méta-réponses :


Voir aussi :

0 votes

La plupart de ces fonctionnalités sont utilisées quotidiennement, certaines sont présentes dans la majorité des scripts Perl, et la plupart de celles listées dans la rubrique "Autres" proviennent d'autres langages, les qualifier de "cachées" change l'intention de la question.

54voto

John Siracusa Points 8106

L'opérateur flip-flop est utile pour sauter la première itération lors du passage en boucle des enregistrements (généralement des lignes) renvoyés par un handle de fichier, sans utiliser de variable drapeau :

while(<$fh>)
{
  next if 1..1; # skip first record
  ...
}

Exécuter perldoc perlop et recherchez "flip-flop" pour plus d'informations et d'exemples.

0 votes

En fait, cela vient de Awk, où l'on peut basculer entre deux motifs en écrivant pattern1, pattern2

15 votes

Pour clarifier, l'aspect "caché" de ceci est que si l'un des opérandes du scalaire ' ' est une constante, la valeur est implicitement comparée au numéro de ligne d'entrée ($.).

47voto

moritz Points 6295

Il existe de nombreuses fonctionnalités non évidentes en Perl.

Par exemple, saviez-vous qu'il peut y avoir un espace après un sigil ?

 $ perl -wle 'my $x = 3; print $ x'
 3

Ou que vous pouvez donner des noms numériques aux sous-marins si vous utilisez des références symboliques ?

$ perl -lwe '*4 = sub { print "yes" }; 4->()' 
yes

Il y a aussi le quasi-opérateur "bool", qui renvoie 1 pour les expressions vraies et la chaîne vide pour les fausses :

$ perl -wle 'print !!4'
1
$ perl -wle 'print !!"0 but true"'
1
$ perl -wle 'print !!0'
(empty line)

Autres éléments intéressants : avec use overload vous pouvez surcharger les chaînes littérales et les nombres (et par exemple en faire des BigInts ou autre).

Beaucoup de ces choses sont documentées quelque part, ou découlent logiquement des fonctionnalités documentées, mais néanmoins certaines ne sont pas très connues.

Mise à jour : Une autre belle photo. En dessous de la q{...} Les constructions de citations ont été mentionnées, mais saviez-vous que vous pouvez utiliser des lettres comme délimiteurs ?

$ perl -Mstrict  -wle 'print q bJet another perl hacker.b'
Jet another perl hacker.

De même, vous pouvez écrire des expressions régulières :

m xabcx
# same as m/abc/

2 votes

"Saviez-vous qu'il peut y avoir un espace après un sigil ?" Je suis complètement abasourdi. Wow.

1 votes

Cool ! !$undef_var ne crée pas d'avertissement.

4 votes

Je pense que votre exemple d'utilisation de lettres pour délimiter les chaînes de caractères devrait être " Juste un autre hacker perl" plutôt que "Jet un autre hacker perl" =P

46voto

timkay Points 183

Ajout de la prise en charge des fichiers compressés via ARGV magique :

s{ 
    ^            # make sure to get whole filename
    ( 
      [^'] +     # at least one non-quote
      \.         # extension dot
      (?:        # now either suffix
          gz
        | Z 
       )
    )
    \z           # through the end
}{gzcat '$1' |}xs for @ARGV;

(les guillemets autour de $_ sont nécessaires pour gérer les noms de fichiers contenant des métacaractères shell)

Maintenant, le <> La fonction décompressera tout @ARGV les fichiers qui se terminent par ".gz" ou ".Z" :

while (<>) {
    print;
}

2 votes

Je ne pense pas que vous ayez besoin d'échapper à la | dans le remplacement.

0 votes

Je regarde ça et je n'arrive pas à comprendre comment ça marche. A quel moment zcat | analysé comme une commande à transmettre ?

1 votes

@Ether => la détection des tuyaux est une caractéristique de l'option open à deux arguments, que l'opérateur diamant utilise lorsqu'il ouvre chaque fichier dans la base de données. @ARGV

40voto

pjf Points 4685

L'une de mes fonctions préférées en Perl est l'utilisation du booléen || l'opérateur doit choisir parmi un ensemble de choix.

 $x = $a || $b;

 # $x = $a, if $a is true.
 # $x = $b, otherwise

Cela signifie que l'on peut écrire :

 $x = $a || $b || $c || 0;

pour prendre la première valeur vraie de $a , $b y $c ou une valeur par défaut de 0 autrement.

En Perl 5.10, il existe également la fonction // qui renvoie le côté gauche s'il est défini, et le côté droit sinon. L'exemple suivant sélectionne la première défini valeur de $a , $b , $c o 0 autrement :

$x = $a // $b // $c // 0;

Ils peuvent également être utilisés avec leurs formes abrégées, qui sont très utiles pour fournir des valeurs par défaut :

$x ||= 0;   # If $x was false, it now has a value of 0.

$x //= 0;   # If $x was undefined, it now has a value of zero.

Cheerio,

Paul

4 votes

Il s'agit d'une expression tellement courante qu'elle peut difficilement être qualifiée de caractéristique "cachée".

3 votes

Dommage que la jolie imprimante pense que // est un commentaire :)

2 votes

Question, y a-t-il une "fonctionnalité d'utilisation" pour utiliser ces nouveaux opérateurs, ou sont-ils activés par défaut ? Je me penche toujours sur les fonctionnalités de Perl 5.10.

39voto

Leon Timmermans Points 23230

Les opérateurs ++ et unaire - ne fonctionnent pas seulement sur les nombres, mais aussi sur les chaînes de caractères.

my $_ = "a"
print -$_

imprime -a

print ++$_

imprime b

$_ = 'z'
print ++$_

imprime aa

3 votes

Pour citer Perlvar : "L'opérateur d'auto-décrémentation n'est pas magique." Donc -- ne fonctionne pas sur les cordes.

0 votes

"aa" ne semble pas être l'élément naturel qui suit "z". Je m'attendrais à la valeur ascii la plus élevée suivante, qui est "{".

4 votes

Ne demandez pas à un programmeur ce qui vient après "z" ; demandez à un humain. Cette fonctionnalité est idéale pour numéroter les éléments d'une longue liste.

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