web-dev-qa-db-fra.com

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

J'ai vu beaucoup de façons d'exécuter du code ou des scripts Perl, avec différents indicateurs. Cependant, lorsque j'essaie de rechercher sur Google ce que chaque drapeau signifie, j'obtiens principalement des résultats sur des sites Perl génériques et aucune information spécifique concernant les drapeaux ou leur utilisation n'y est trouvée.

Vous trouverez ci-dessous les drapeaux que je rencontre le plus souvent et je n’ai aucune idée de ce qu’ils signifient:

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

Je serai très reconnaissant si vous me dites ce que chacun de ces moyens et quelques cas d'utilisation pour eux, ou du moins me dire un moyen de découvrir leur signification.

100
Tudor Constantin

Oui, Google est notoirement difficile à consulter pour la ponctuation et, malheureusement, Perl ne semble être principalement constitué 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)

Entrer brièvement dans les options, une par une:

 - p: place une boucle d’impression autour de votre commande afin qu’elle agisse sur chaque ligne 
 d’entrée standard. Utilisé principalement pour permettre à Perl de vaincre le 
 En termes de puissance ET de simplicité: -) 
 - n: place une boucle sans impression autour de votre commande. 
 - e: Vous permet de fournir le programme sous forme d'argument plutôt que 
 Plutôt que dans un fichier. Vous ne voulez pas avoir à créer un fichier de script 
 Pour chaque petite ligne d'un Perl. 
 - i: modifie votre fichier d'entrée sur place (en effectuant une sauvegarde du 
 original). Pratique pour modifier les fichiers sans le processus {copie, 
 Suppression-original, renommer}. 
 - w: active certains avertissements. Tout bon codeur Perl utilisera ceci. 
 - d: s’exécute sous le débogueur Perl. Pour le débogage de votre code Perl, 
 Évidemment. 
 - t: Traite certains codes "corrompus" (douteux) comme des avertissements (le mode correct 
 D'erreur contiendra ce code douteux). Utilisé pour renforcer 
 La sécurité Perl, en particulier lors de l'exécution de code pour d'autres utilisateurs de 
, Tels que les scripts setuid ou les éléments Web.
138
paxdiablo

Le -p flag 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ète que toutes les données transmises à STDIN par le script d'exécution doivent être effectuées sur place.

-w est le même que use warnings;, mais dans un contexte global plutôt que local

-d exécute le débogueur Perl

10
zellio

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($_ = <ARGV>)) {
    '???';
}
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($_ = <ARGV>)) {
    '???';
}
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($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Mais rappelez-vous, <ARGV> utilise un argument ouvert de 2 arguments. Par conséquent, les noms de fichiers commençant par > < ou début/fin avec |.

8
liame

Il existe également un indicateur important -n Qui n'est pas mentionné dans la liste.

-n Fonctionne de la même manière que -p, Sauf qu'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 Dans une seule ligne.

Par exemple:

Perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

Affiche toutes les valeurs entières trouvées après "Les messages lisent:" et rien de plus.

4
rustyx