Scroll to navigation

A2P(1) Guide de référence des programmeurs Perl A2P(1)

NOM

a2p - Traduteur de commande Awk à Perl

SYNOPSIS

a2p [options] nom de fichier

DESCRIPTION

A2p prend un script awk spécifié en ligne de commande (ou depuis l'entrée standard) et produit un script perl comparable sur la sortie standard.

Options

Options incluses :

Initialise les variables de déboguage.
Dit à a2p que ce script awk est toujours appelé avec le paramètre -F.
Spécifie les noms de champs d'entrée si l'entrée n'a pas été « mappée » dans un tableau. Si vous traduisiez un script awk qui traite le fichier de mot de passe, vous devriez écrire :

        a2p -7 -nlogin.password.uid.gid.gcos.shell.home
    

N'importe quel délimiteur peut être utilisé pour séparer les noms des champs.

-<nombre>
Dit à a2p que l'entrée aura toujours ce nombre de champs.
Dit à a2p d'utiliser un comportement d'une ancienne version de awk. Les seules différences courantes à ce jour sont :
  • Les anciennes versions awk ont une boucle de ligne, même si il n'a a aucune action dans la ligne, tandis que la nouvelle version de awk n'en a pas.
  • Dans les anciennes versions de awk, sprintf est extrêmement avide de ses arguments. Par exemple, voici une déclaration

            print sprintf(some_args), extra_args;
        

    Les anciennes versions de awk considèrent que les extra_args sont des arguments de "sprintf"; les nouvelles versions de awk considèrent ces mêmes arguments comme appartenant à "print".


"Considerations"

A2p ne peut pas faire un travail de traduction aussi bien qu'un humain, mais il le fait souvant pas mal. Il y a des endroits où vous devriez examiner le script Perl produit et le modifier un peu. Voici certains d'entre eux, sans ordre particulier.

Il y a une façon de faire en awk pour forcer une interprétation numérique en entourant une expression de chaine de caractères avec int(), bien que l'argument soit toujours un entier de toute façon. Cela n'est pas nécéssaire en Perl, mais a2p ne peut pas dire si l'argument doit toujours continué d'être un entier, donc il le laisse tel quel. Vous pouvez vouloir l'enlever.

Perl différencie les comparaisons numériques des comparaisons de chaîne de caractères. Awk a un opérateur pour les deux et décide au moment de l'exécution (run time) quel type de comparaison faire. A2p n'essaie pas de faire un travail complet d'émulation à ce stade. Au lieu de cela il suppose lequel vous voulez. C'est presque toujours bon, mais il peut se tromper. Tout ce qui est le résultat d'une supposition est marqué avec des commentaires. ""#???"". Vous devriez passer pour les vérifier. Vous devriez lancer au moins une fois avec le paramètre -w de Perl, lequel vous avertira si vous utilisez == au lieu d'utiliser eq.

Perl n'essaie pas d'imiter le comportement d'awk dans lequel des éléments de tableau inexistants apparaissent brusquement simplement en y faisant référence. Si, d'une façon ou d'une autre, vous comptez sur ce mécanisme pour créer des entrées nulles pour un traitement postérieur pour... dedans, il ne seront pas présent dans Perl.

Si a2p découpe une ligne et l'assigne a une liste de variables qui ressemble à (Fld1, Fld2, Fld3...) vous devriez relancer a2p en utilisant l'option -n mentionnée ci-dessus. Cela vous laissera nommer les champs partout dans le script. Si ça vous découpe la ligne en tableau, le script se réfère probablement à un nombre de champs quelque part.

Le statut de fin dans awk n'est pas forcément la fin du script ; il va au bloc END s'il y en a un. Les scripts awk qui contorsionnent dans le bloc END pour contourner ce même bloc peuvent être simplifiés dans de telle circonstance en enlevant la condition dans le bloc END et juste en sortant directement du script Perl.

Perl a deux sortes de tableaux, les numériques indexés et les associatifs. Les tableaux associatifs de Perl sont appellés "hashes". Les tableaux Awk sont souvent traduient en « hashes », mais s'il vous arrive de savoir qu'un index sera toujours de type numérique, vous pourriez changer les {...} par des [...]. Les itérations sur un tableau de type « hashes » sont faites en utilisant la fonction keys(), mais les itérations sur un tableau numérique sont NOT. Vous devriez avoir besoin de modifier chacune des boucles qui réitère sur ce type de tableau.

Awk commence par supposer que OFMT a la valeur %.6g. Perl commence par supposer que sont équivalent, $#, à la valeur %.20g. Vous pourriez vouloir initialiser explicitement $# si vous utilisez la valeur par défaut de OFMT.

Près du début de la ligne de boucle seront découpées les opérations qui sont implicites dans le script Awk. Il y a des fois, quand vous pouvez déplacer ces opérations plus bas, les conditions qui testent entièrement l'enregistrement entraînent un découpage différent de ce qui est fait d'habitude.

Pour des raisons esthétiques vous pourriez vouloir changer la base d'un tableau $[ à 1 au lieu de la valeur 0 qui est celle par défaut dans Perl, mais souvenez vous de changer tous les indices de tableau ET tous les substr() et les opérations index() pour que cela corresponde.

On passe les commentaires qui disent "# Here is a workaround because awk is dumb",ca reste inchangé.

Les scripts Awk sont souvent incorporés dans des scripts en Shell qui « tunnelisent » les informations entrantes et sortantes de Awk. Souvent l'emballage de script Shell peut être incorporé dans le script Perl, depuis que Perl peut démarrer en se « tunnelisant » lui-même, et peut faire d'autres choses que awk ne peut pas faire lui-même.

Les scripts qui font référence aux variables spéciales RSTART et RLENGTH peuvent souvent être simplifiés en faisant référence aux variables $`, $& et $', tant qu'elles sont dans les limites du modèle qui les a initialisées.

Le script Perl produit peut avoir des sous-routines définies pour traiter les sémantiques awk quant aux impressions et les commandes de saisies. Depuis a2p choisit d'habitude la justesse sur l'efficacité. C'est presque toujours possible de réécrire un tel code pour être plus efficace en renoncant au code superflu.

Pour plus d'efficacité, vous pourriez vouloir enlever le mot-clé de n'importe quelle déclaration de retour qui est la dernière déclaration exécutée dans un sous-programme. a2p attrape la plupart des cas communs, mais n'analyse pas de blocs incorporés pour des cas plus subtils.

ARGV[0] est traduit en $ARGV0, mais ARGV[n] est traduit en $ARGV[$n]. Une boucle qui essaierait de réitérer sur ARGV[0] ne le trouverait pas.

ENVIRONNEMENT

A2p n'utilise pas de variable d'environnement.

AUTEUR

Larry Wall <larry@wall.org>

FICHIERS

VOIR AUSSI

 perl   Le compilateur/interpréteur Perl

 s2p    traducteur de sed à perl

BOGUES

Il devrait être possible d'émuler le comportement de awk dans le choix entre une chaine de caractères ou les opérations numériques, au moment de l'exécution par inspection des opérandes, mais ce serait brutal et inefficace. En plus, a2p devine presque toujours correctement.

Le stockage de l'arbre de syntaxe de awk est actuellement statique, et peut-être expiré.

TRADUCTION

Christophe Labarthe, 2003.

2003-09-30 perl v5.8.2