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.
Christophe Labarthe, 2003.