Drapeaux Perl -pe, -pi, -p, -w, -d, -i, -t?

J’ai vu de nombreuses façons d’exécuter du code Perl ou des scripts, avec des indicateurs différents. Cependant, lorsque j’essaie de rechercher ce que signifie chaque indicateur, j’obtiens principalement des résultats sur des sites Perl génériques et aucune information spécifique concernant les indicateurs ou leur utilisation ne se trouve là.

Vous trouverez ci-dessous les drapeaux que je rencontre le plus souvent et je ne sais pas ce qu’ils signifient:

  • perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

Je vous serais très reconnaissant de me dire ce que signifient chacun de ces cas et certains cas d’utilisation pour eux, ou du moins de me dire comment trouver leur signification.

Oui, Google est notoirement difficile pour rechercher la ponctuation et, malheureusement, Perl semble être principalement composé de ponctuation 🙂

Les commutateurs de ligne de commande sont tous détaillés dans perlrun . (disponible à partir de la ligne de commande en appelant perldoc perlrun )

Aller dans les options brièvement, un par un:

 -p: Place une boucle d'impression autour de votre commande pour qu'elle agisse sur chaque
     ligne d'entrée standard.  Utilisé principalement pour que Perl puisse battre le
     pantalon hors de scope en termes de puissance ET de simplicité :-)
 -n: place une boucle non imprimable autour de votre commande.
 -e: vous permet de fournir le programme en argument plutôt
     que dans un fichier.  Vous ne voulez pas avoir à créer un script
     fichier pour chaque petit one-liner Perl.
 -i: modifie votre fichier d'entrée sur place (en effectuant une sauvegarde du fichier
     original).  Pratique pour modifier des fichiers sans la {copie,
     supprimer-original, renommer} processus.
 -w: active des avertissements.  Tout bon codeur Perl utilisera ceci.
 -d: s'exécute sous le débogueur Perl.  Pour déboguer votre code Perl,
     évidemment.
 -t: traite certains codes "douteux" (douteux) comme des avertissements
     le mode taint erreur sur ce code douteux).  Utilisé pour bœuf
     la sécurité Perl, en particulier lors de l'exécution de code pour d'autres
     utilisateurs, tels que des scripts setuid ou des éléments Web.

L’indicateur -p exécute essentiellement le script avec

 while (<>) { # exec here } continue { print or die "-p destination: $!\n"; } 

-e vous permet de passer un script à STDIN

 perl -e '$x = "Hello world!\n"; print $x;' 

-i indique à l’interpréteur que toutes les données transmises à STDIN par le script d’exécution doivent être effectuées sur place.

-w est identique use warnings; , mais dans un contexte global plutôt que local

-d exécute le débogueur Perl

D’autres ont mentionné perlrun. Si vous utilisez B :: Deparse, vous pouvez voir ce que cela signifie (pour la plupart des choses):

 $ perl -MO=Deparse -p -e 1 LINE: while (defined($_ = )) { '???'; } continue { die "-p destination: $!\n" unless print $_; } -e syntax OK 

1 est représenté par «???», car il est optimisé.

 $ perl -MO=Deparse -p -i -e 1 BEGIN { $^I = ""; } LINE: while (defined($_ = )) { '???'; } continue { die "-p destination: $!\n" unless print $_; } -e syntax OK 

-i définit $ ^ I, comme

 $ perl -MO=Deparse -p -i.bak -e 1 BEGIN { $^I = ".bak"; } LINE: while (defined($_ = )) { '???'; } continue { die "-p destination: $!\n" unless print $_; } -e syntax OK 

Mais souvenez-vous que utilise 2 arguments ouverts, donc les noms de fichiers ne commencent pas par > < ou ne commencent / finissent pas par | .

Il y a aussi un indicateur important -n qui n’est pas mentionné dans la liste.

-n fonctionne de la même manière que -p , mais il n’imprime pas $_ par défaut. Cela peut être très utile pour filtrer les fichiers texte.

De cette façon, Perl peut remplacer grep | sed grep | sed dans un seul one-liner.

Par exemple:

perl -ne 'print "$1\n" if /Messages read: (\d+)/'

Imprime chaque valeur entière trouvée après "Messages lus:", et rien de plus.