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

107

J'ai vu de nombreuses 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 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 s'y trouve.

Voici 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 vous serai très reconnaissant si vous me disiez ce que chacun de ces éléments signifient et quelques cas d'utilisation pour eux, ou au moins me dire un moyen de découvrir leur signification.

Tudor Constantin
la source
21
rechercher des réponses de base sur perl sur Google vous mènera souvent à des sites vraiment inutiles. vérifiez toujours d'abord la documentation de perl.
ysth
2
Appuyé. Dans ce cas, perldoc perlruna une liste de toutes les options de ligne de commande acceptées par Perl.
Sherm Pendley
1
Problème de Google: le signe moins est interprété par Google comme signifiant "exclure ce terme". Pour éviter ce problème, placez le terme contenant le signe moins entre guillemets.
Roger Krueger

Réponses:

147

Oui, Google est notoirement difficile pour rechercher des signes de ponctuation et, malheureusement, Perl ne semble être principalement composé de ponctuation :-)

Les commutateurs de ligne de commande sont tous détaillés dans perlrun . (disponible depuis 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 pour qu'elle agisse sur chaque
    ligne d'entrée standard. Utilisé principalement pour que Perl puisse battre
    pantalon off awk en termes de puissance ET de simplicité :-)
-n: Place une boucle sans impression autour de votre commande.
-e: vous permet de fournir le programme comme 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
    original). Pratique pour modifier des fichiers sans la {copie,
    supprimer-original, renommer} processus.
-w: active certains avertissements. Tout bon codeur Perl l'utilisera.
-d: s'exécute sous le débogueur Perl. Pour déboguer votre code Perl,
    évidemment.
-t: traite certains codes "corrompus" (douteux) comme des avertissements (correct
    le mode taint fera une erreur sur ce code douteux). Utilisé pour le boeuf
    sécurité Perl, en particulier lors de l'exécution de code pour d'autres
    utilisateurs, tels que les scripts setuid ou des éléments Web.
paxdiablo
la source
1
Je n'ai pas remarqué que vous en parliez perldoc perlrun. J'ai supprimé ma réponse. :-)
Alan Haggai Alavi
4
-west généralement à éviter, en fait, car il active les avertissements pour tout le code, y compris les modules CPAN qui n'ont pas été écrits avec des avertissements à l'esprit. Les résultats sont généralement assez bruyants et inutiles.
duskwuff -inactif-
9
-west généralement évité, mais il doit être remplacé par use warningsdans votre propre code.
plusplus
6
@duskwuff: En général, je suis d'accord, et je le fais use warningsdans mon propre code, mais -w a une utilité - cela aide à éliminer les modules CPAN mal écrits. :-)
Sherm Pendley
2
@IanBytchek Les arguments qui peuvent / doivent prendre un paramètre supplémentaire ne peuvent pas être dans une liste compressée. -iprend une extension pour la sauvegarde. -eprend une commande perl. En -0ep vous dites à perl que «p» est une commande perl au lieu d'un argument. Cela ne fonctionnera pas du tout.
tjd
10

L' -pindicateur exécute essentiellement le script avec

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

-e vous permet de transmettre un script à STDIN

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

-iindique à l'interpréteur que toutes les données transmises STDINpar le script en cours d'exécution doivent être effectuées sur place.

-west identique à use warnings;, mais dans une portée globale plutôt que locale

-d exécute le débogueur Perl

zellio
la source
2
-wn'est pas tout à fait le même que use warnings, ce dernier est limité au fichier local
plusplus
plusplus, vrai, réponse corrective.
zellio
2
Passer le script comme argument n'est pas la même chose que le transmettre à STDIN. -i prend les noms de fichiers de la liste d'arguments, pas stdin. Bien que STDIN soit souvent associé au terminal de contrôle et hérité du shell qui lit stdin et configure la liste d'arguments en perl, ce n'est PAS la même chose.
William Pursell
8

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 que <ARGV> utilise 2 arguments open, donc ne pas avoir de noms de fichiers commençant par > <ou commençant / finissant par |.

liame
la source
4

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

-nfonctionne de la même manière que -p, mais il ne s'imprime pas $_par défaut. Cela peut être très utile pour filtrer les fichiers texte.

De cette façon, Perl peut remplacer grep | seden 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 "Messages lus:", et rien de plus.

rustyx
la source
Cela peut être encore simplifié. Il n'y a pas besoin de "print" $ 1 \ n "". Vous pouvez simplement utiliser "imprimer" à la place.
dévoré l'elysium
Non, ce print $1n'est pas la même chose que print( print $_).
rustyx
Il peut: echo abc | perl -nw -e "print if (1)"imprimer abc. Pas besoin de $1référence.
dévoré l'elysium
@devouredelysium: Oui, mais ne veut pas imprimer la ligne entière, mais uniquement le nombre correspondant à l'expression régulière.
Ingo Blechschmidt