anglaisfrançaisespagnol

Icône de favori OnWorks

perlhacktut - En ligne dans le Cloud

Exécutez perlhacktut dans le fournisseur d'hébergement gratuit OnWorks sur Ubuntu Online, Fedora Online, l'émulateur en ligne Windows ou l'émulateur en ligne MAC OS

Il s'agit de la commande perlhacktut qui peut être exécutée dans le fournisseur d'hébergement gratuit OnWorks en utilisant l'un de nos multiples postes de travail en ligne gratuits tels que Ubuntu Online, Fedora Online, l'émulateur en ligne Windows ou l'émulateur en ligne MAC OS

PROGRAMME:

Nom


perlhacktut - Présentation de la création d'un simple correctif de code C

DESCRIPTION


Ce document vous guide à travers un exemple de patch simple.

Si vous n'avez pas encore lu perlhack, faites-le d'abord ! Vous voudrez peut-être aussi lire
perlsource aussi.

Une fois que vous avez terminé ici, consultez ensuite perlhacktips.

EXEMPLE OF A SIMPLE PATCH


Prenons un simple patch du début à la fin.

Voici une suggestion de Larry : si un « U » est le premier format actif lors d'un « pack »,
(par exemple, "pack "U3C8", @stuff"), la chaîne résultante doit être traitée comme UTF-8
codé.

Si vous travaillez avec un clone git du référentiel Perl, vous voudrez créer un
branche pour vos modifications. Cela rendra la création d'un patch approprié beaucoup plus simple. Voir le
perlgit pour plus de détails sur la façon de procéder.

Écriture le pièce
Comment se prépare-t-on à arranger ça ? Nous localisons d'abord le code en question - le "pack"
se produit au moment de l'exécution, ce sera donc dans l'un des pp des dossiers. Effectivement, "pp_pack" est
in pp.c. Puisque nous allons modifier ce fichier, copions-le dans pp.c~.

[Eh bien, c'était dans pp.c quand ce tutoriel a été écrit. Il a maintenant été séparé avec
"pp_unpack" dans son propre fichier, pp_pack.c]

Regardons maintenant "pp_pack": nous prenons un motif dans "pat", puis boucle sur le
pattern, en prenant chaque caractère de format à son tour dans "datum_type". Alors pour chaque possible
caractère de format, on engloutit les autres arguments du motif (une largeur de champ, un
astérisque, et ainsi de suite) et convertissez le prochain bloc d'entrée au format spécifié, en l'ajoutant
sur la sortie SV "cat".

Comment savons-nous si le "U" est le premier format dans le "pat" ? Eh bien, si nous avons un pointeur vers
le début de "pat" alors, si on voit un "U" on peut tester si on est toujours au début de
la chaîne. Alors, voici où "pat" est configuré :

STRLEN delen ;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
lentille I32 ;
type de référence I32 ;
SV *destr;

Nous aurons un autre pointeur de chaîne là-dedans :

STRLEN delen ;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
+ caractère *patcopy;
lentille I32 ;
type de référence I32 ;
SV *destr;

Et juste avant de commencer la boucle, nous allons définir "patcopy" pour être le début de "pat":

éléments = SP - MARK ;
MARQUE++ ;
sv_setpvn(chat, "", 0);
+ patcopy = pat;
while (tapoter < breveter) {

Maintenant, si nous voyons un "U" qui était au début de la chaîne, nous activons le drapeau "UTF8" pour
la sortie SV, "cat":

+ if (datumtype == 'U' && pat==patcopy+1)
+ SvUTF8_on(chat);
if (typedatum == '#') {
while (pat < patend && *pat != '\n')
pat++;

Rappelez-vous qu'il doit être "patcopy+1" car le premier caractère de la chaîne est le
"U" qui a été avalé dans "datumtype!"

Oups, nous avons oublié une chose : et s'il y avait des espaces au début du motif ? "pack("
U*", @stuff)" aura "U" comme premier caractère actif, même si ce n'est pas le premier
chose dans le modèle. Dans ce cas, nous devons faire avancer "patcopy" avec "pat" lorsque nous
voir les espaces :

si (estESPACE(type de référence))
continuer

doit devenir

if (isSPACE(type de donnée)) {
copie pat++ ;
continuer
}

D'ACCORD. C'est la partie C terminée. Maintenant, nous devons faire deux choses supplémentaires avant que ce patch soit
prêt à partir : nous avons changé le comportement de Perl, et nous devons donc documenter ce changement. Nous
doit également fournir des tests de régression supplémentaires pour s'assurer que notre correctif fonctionne et non
créer un bogue ailleurs le long de la ligne.

Contrôle de qualité le pièce
Les tests de régression pour chaque opérateur vivent dans Haut/, et donc nous faisons une copie de t/op/pack.t
à t/op/pack.t~. Nous pouvons maintenant ajouter nos tests à la fin. Tout d'abord, nous allons tester que le "U" fait
en effet créer des chaînes Unicode.

t/op/pack.t a un sens d'accord() fonction, mais si ce n'était pas le cas, nous pourrions utiliser celui de
t/test.pl.

nécessite './test.pl';
planifier( tests => 159 );

donc au lieu de ça :

print 'not ' sauf si "1.20.300.4000" eq sprintf "%vd",
pack("U*",1,20,300,4000);
print "ok $test\n" ; $test++ ;

nous pouvons écrire le plus sensé (voir Test::More pour une explication complète de est() et d'autres
fonctions de test).

est( "1.20.300.4000", sprintf "%vd", pack("U*",1,20,300,4000),
"U* produit Unicode" );

Nous allons maintenant vérifier que nous avons bien compris cet espace au début :

est( "1.20.300.4000", sprintf "%vd", pack(" U*",1,20,300,4000),
" avec des espaces au début " );

Et enfin, nous testerons que nous ne faisons pas de chaînes Unicode si "U" est ne sauraient le premier actif
Format:

n'est pas( v1.20.300.4000, sprintf "%vd", pack("C0U*",1,20,300,4000),
"U* pas d'abord n'est pas Unicode" );

Il ne faut pas oublier de changer le nombre de tests qui apparaît en haut, sinon le
le testeur automatisé sera confus. Cela ressemblera soit à ceci:

imprimer "1..156\n" ;

ou ca:

planifier( tests => 156 );

Nous compilons maintenant Perl et l'exécutons à travers la suite de tests. Nos nouveaux tests réussissent, hourra !

Documenter le pièce
Enfin, la documentation. Le travail n'est jamais terminé tant que la paperasse n'est pas terminée, alors allons-y
décrire le changement que nous venons de faire. Le lieu concerné est pod/perlfunc.pod; encore une fois, nous
faire une copie, puis nous insérerons ce texte dans la description de "pack":

= élément *

Si le motif commence par un C , la chaîne résultante sera traitée
comme Unicode codé en UTF-8. Vous pouvez forcer l'encodage UTF-8 dans une chaîne
avec un C initial , et les octets qui suivent seront interprétés comme
Caractères Unicode. Si vous ne voulez pas que cela se produise, vous pouvez commencer
votre modèle avec C (ou quoi que ce soit d'autre) pour forcer Perl à ne pas utiliser UTF-0
encodez votre chaîne, puis suivez-la avec un C quelque part dans votre
motif.

Envoyer
Voir perlhack pour plus de détails sur la façon de soumettre ce correctif.

Utilisez perlhacktut en ligne en utilisant les services onworks.net


Serveurs et postes de travail gratuits

Télécharger des applications Windows et Linux

Commandes Linux

Ad