a2p |
AWK à Perl |
---|---|
Linux | Externe |
Syntaxe
a2p [-Dnumber] [-Fcharacter] [-nfieldlist] [-number] [-o] [filename] |
Paramètres
Nom | Description |
---|---|
-D | Ce paramètre permet de fixer le drapeau de déboguage |
-F | Ce paramètre permet d'indiquer de nom de champs |
- | Ce paramètre permet d'indiquer à l'utilitaire qu'il y a toujours des champs |
-o | Ce paramètre permet d'indiquer l'ancien awk. |
filename | Ce paramètre permet d'indiquer le nom du fichier à convertir |
Description
Cette commande permet de convertir un script de langage de programmation awk en un script de langage de programmation Perl et affiche le résultat sur la sortie standard.
Remarques
- La commande a2p ne fait pas un travail de conversion aussi bon qu'un humain, mais il le fait généralement assez bien. Il y a certains domaines où vous voudrez peut-être examiner le script perl produit et le peaufiner. En voici un : Il existe un idiome awk consistant à mettre int() autour d'une expression de chaîne de caractères pour forcer l'interprétation numérique, même si le paramètre est toujours un entier de toute façon. C'est généralement inutile en perl, mais a2p ne peut pas dire si le paramètre sera toujours un entier, donc il le laisse de côté. Vous pouvez le supprimer.
- Le Perl différencie la comparaison numérique de la comparaison de chaînes de caractères. Le awk a un opérateur pour les deux décidant au moment de l'exécution quelle comparaison effectuer. Le a2p n'essaie pas de faire un travail complet d'émulation awk à ce stade. Au lieu de cela, il devine lequel vous voulez. C'est presque toujours vrai, mais cela peut être usurpé. Toutes ces suppositions sont marquées du commentaire ""#???"". Vous devriez les parcourir et les vérifier. Vous voudrez peut-être exécuter au moins une fois avec le commutateur -w vers perl, vous avertissant si vous utilisez == là où vous auriez dû utiliser eq.
- Le Perl n'essaie pas d'émuler le comportement de awk dans lequel des éléments de tableau inexistants apparaissent simplement en étant référencés. Si d'une manière ou d'une autre vous comptez sur ce mécanisme pour créer des entrées nulles pour un for...in ultérieur, elles ne seront pas là dans perl.
- Si a2p crée une ligne de séparation attribuant à une liste de variables ressemblant à (Fld1, Fld2, Fld3...), vous voudrez peut-être réexécuter a2p en utilisant l'option -n. Cela vous permettra de nommer les champs tout au long du script. S'il se divise plutôt en un tableau, le script fait probablement référence au nombre de champs quelque part.
- L'instruction exit dans awk ne se termine pas nécessairement ; il va au bloc END s'il y en a un. Les scripts Awk faisant des contorsions dans le bloc END pour contourner le bloc dans de telles circonstances peuvent être simplifiés en supprimant le conditionnel dans le bloc END et en sortant directement du script perl.
- Le Perl a deux types de tableaux, indexés numériquement et associatifs. Les tableaux associatifs Perl sont appelés "hachages". Les tableaux Awk sont généralement converties en hachages, mais si vous savez que l'index sera toujours numérique, vous pouvez remplacer le {...} par [...]. L'itération sur un hachage est effectuée à l'aide de la fonction keys(), mais l'itération sur un tableau est NOT. Vous devrez peut-être modifier toute boucle itérant sur un tel tableau.
- Le Awk commence par supposer que OFMT a la valeur %.6g. Le Perl commence par supposer que son équivalent, $#, a la valeur %.20g. Vous voudrez définir $# explicitement si vous utilisez la valeur par défaut de OFMT.
- Près du haut de la boucle de ligne se trouve l'opération de division implicite dans le script awk. Il y a des moments où vous pouvez déplacer cela au-delà de certaines conditions testant l'ensemble de l'enregistrement afin que la division ne soit pas effectuée aussi souvent.
- Pour des raisons esthétiques, vous souhaiterez peut-être modifier la base du tableau «$[» de 1 à la valeur par défaut de Perl de 0, mais n'oubliez pas de modifier tous les indices de tableau et toutes les opérations substr() et index() pour qu'elles correspondent.
- Les commentaires disant «#» indiquant une solution de contournement, car awk est rudimentaire, sont transmis sans modification.
- Les scripts Awk sont souvent intégrés dans un script d'interpréteur de commande dirigeant des éléments vers et depuis awk. Souvent, l'enveloppe de script d'interpréteur de commande peut être incorporée dans le script perl, puisque perl peut démarrer des canaux vers et hors de lui-même, et peut faire d'autres choses que awk ne peut pas faire tout seul.
- Les scripts faisant référence aux variables spéciales RSTART et RLENGTH peuvent souvent être simplifiés en se référant aux variables $', $& et $', tant qu'elles sont dans la portée de la correspondance de modèle les définissant.
- Le script perl produit peut avoir des sous-routines définies pour gérer la sémantique d'awk concernant getline et print. Puisque a2p choisit généralement l'exactitude plutôt que l'efficacité. Il est presque toujours possible de réécrire un tel code pour être plus efficace en se débarrassant du superflue sémantique.
- Pour plus d'efficacité, vous pouvez supprimer le mot-clef de toute instruction return étant la dernière instruction exécutée dans un sous-programme. Le a2p détecte le cas le plus courant, mais n'analyse pas les blocs intégrés pour les cas plus subtils.
- Le ARGV[0] se traduit par $ARGV0, mais ARGV[n] se traduit par $ARGV[$n]. Une boucle essayant d'itérer sur ARGV[0] ne la trouvera donc pas.
- Le a2p n'utilise aucune variable d'environnement.
Exemple
Prenons pour acquis le fichier de langage de programmation AWK ayant le nom «bonjour.awk» :
#! /bin/sh
BEGIN {
print "Bonjour!";
exit;
}
Si on veut sortir sa source en Perl, on tape ceci :
a2p bonjour.awkEnter |
on obtiendra un résultat ressemblant à ceci :
#!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; # this emulates #! processing on NIH machines. # (remove #! line above if indigestible) eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift; # process any FOO=bar switches #! /bin/sh $, = ' '; # set output field separator $ = " "; # set output record separator print 'Bonjour!'; last line; |
Voir également
Système d'exploitation - Linux - Références de commandes et de programmes - awk
Système d'exploitation - Linux - Références de commandes et de programmes - perl
Système d'exploitation - Linux - Références de commandes et de programmes - s2p
Langage de programmation - awk - Accueil
Langage de programmation - Perl - Accueil
Dernière mise à jour : Mardi, le 12 août 2014