112 votes

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

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

Voici les drapeaux que je rencontre le plus souvent, et dont je n'ai pas la moindre idée de la signification :

  • 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 chacun de ces éléments signifie et de me présenter des cas d'utilisation, ou du moins de m'indiquer un moyen de trouver leur signification.

22 votes

La recherche de réponses de base sur perl sur Google vous mènera souvent à des sites très peu utiles. Consultez toujours la documentation de perl en premier lieu.

1 votes

3 votes

Secondé. Dans ce cas, perldoc perlrun contient une liste de toutes les options de ligne de commande que Perl accepte.

157voto

paxdiablo Points 341644

Oui, Google est notoirement difficile pour rechercher la ponctuation et, malheureusement, Perl fait semblent être principalement constituées de ponctuation :-)

Les commutateurs de ligne de commande sont tous détaillés dans perlrun (disponible en ligne de commande en appelant perldoc perlrun ). Je passe brièvement en revue les options, une par une :

  • -p : Place une boucle d'impression autour de votre commande afin qu'elle agisse sur chaque ligne de l'entrée standard. Utilisé principalement pour que Perl puisse battre Awk en termes de puissance ET de simplicité :-)
  • -n : Place une boucle non-imprimante autour de votre commande.
  • -e : Permet de fournir le programme en argument plutôt que dans un fichier. Vous ne voulez pas avoir à créer un fichier script pour chaque petit one-liner Perl.
  • -i : Modifie votre fichier d'entrée sur place (en faisant une sauvegarde de l'original). Pratique pour modifier des fichiers sans la fonction {copy, delete-original, rename} 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 "tainted" (douteux) comme des avertissements (le mode taint correct fera une erreur sur ce code douteux). Utilisé pour renforcer la sécurité de Perl, en particulier lors de l'exécution de code pour d'autres utilisateurs, comme setuid scripts ou des trucs web.

1 votes

Je n'ai pas remarqué que vous avez fait référence à perldoc perlrun . J'ai supprimé ma réponse :-)

0 votes

Merci pour votre réponse éclairante

4 votes

-w est généralement à éviter, en fait, car il permet d'activer les avertissements pour les tous y compris les modules CPAN qui n'ont pas été écrits en tenant compte des avertissements. Les résultats sont généralement assez bruyants, ainsi qu'assez inutiles.

12voto

zellio Points 8863

Le site -p exécute fondamentalement le script avec

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

-e vous permet de passer un script en tant que paramètre plutôt que comme un fichier :

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

-i indique à l'interpréteur que toutes les données passées à STDIN par le script en cours d'exécution doit se faire sur place.

-w est la même chose que use warnings; mais dans un cadre mondial plutôt que local

-d exécute le débogueur Perl

2 votes

-w n'est pas tout à fait la même chose que use warnings ce dernier est adapté au fichier local

0 votes

Plusplus, vrai, Parcheando réponse.

2 votes

Passer le script comme argument n'est pas la même chose que de le passer sur STDIN. -i prend les noms de fichiers de la liste d'arguments, pas de stdin. Alors que STDIN est souvent associé au terminal de contrôle, et est hérité du shell qui lit stdin et configure la liste d'arguments à perl, ils ne sont PAS la même chose.

8voto

liame Points 41

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

Le 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 open à 2 arguments, donc n'ayez pas de noms de fichiers qui commencent par > < ou commencer/terminer avec | .

5voto

rustyx Points 2722

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

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

De cette façon, Perl peut remplacer grep | sed en une seule phrase.

Par exemple :

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

Imprime toutes les valeurs entières trouvées après " Messages lus : ", et rien de plus.

2voto

Dave Cross Points 17363

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