İngilizceFransızcaİspanyolca

OnWorks favicon'u

perlhacktut - Bulutta Çevrimiçi

Perlhacktut'u OnWorks ücretsiz barındırma sağlayıcısında Ubuntu Online, Fedora Online, Windows çevrimiçi öykünücüsü veya MAC OS çevrimiçi öykünücüsü üzerinden çalıştırın

Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen perlhacktut komutudur.

Program:

ADI


perlhacktut - Basit bir C kodu yamasının oluşturulmasında adım adım ilerleyin

TANIM


Bu belge sizi basit bir yama örneğine götürür.

Henüz perlhack okumadıysanız, önce onu yapın! Ayrıca baştan sona okumak isteyebilirsiniz
perlsource da.

Burada işiniz bittiğinde, sonraki perlhacktips'e göz atın.

ÖRNEK OF A BASİT YAMA


Baştan sona basit bir yama yapalım.

Larry'nin önerdiği bir şey var: "Paket" sırasında "U" ilk etkin biçimse,
(örneğin, "pack "U3C8", @stuff") daha sonra elde edilen dize UTF-8 olarak ele alınmalıdır
kodlanmış.

Perl deposunun bir git klonu ile çalışıyorsanız, bir
değişiklikleriniz için şube. Bu, uygun bir yama oluşturmayı çok daha basit hale getirecektir. Bkz.
Bunun nasıl yapılacağına ilişkin ayrıntılar için perlgit.

Yazı Yazmak the yama
Bunu düzeltmek için nasıl hazırlanırız? İlk önce söz konusu kodu buluyoruz - "paket"
çalışma zamanında olur, bu nedenle pp Dosyalar. Tabii ki, "pp_pack"
in ppc. Bu dosyayı değiştireceğimize göre, şuraya kopyalayalım: ppc~.

[Şey, içindeydi ppc Bu öğretici yazıldığında. Şimdi ile ayrıldı
"pp_unpack" dosyasını kendi dosyasına, pp_pack.c]

Şimdi "pp_pack"e bakalım: "pat"a bir kalıp alıyoruz ve sonra
desen, her biçim karakterini sırayla "datum_type" a alır. Sonra her olası için
biçim karakteri, kalıptaki diğer argümanları yutarız (bir alan genişliği, bir
yıldız işareti vb.) ve sonraki yığın girdisini ekleyerek belirtilen biçime dönüştürün
SV "cat" çıkışına.

"U"nun "pat"taki ilk format olup olmadığını nasıl anlarız? Peki, eğer bir işaretçimiz varsa
"pat" ın başlangıcı o zaman, bir "U" görürsek, hala başında olup olmadığımızı test edebiliriz.
dize. İşte "pat"ın kurulduğu yer:

STRLEN'den gelen;
char *pat = SvPVx(*++MARK, fromlen);
char *patent = pat + fromlen;
I32 uzunluk;
I32 veri türü;
SV * fromstr;

Orada başka bir dize işaretçimiz olacak:

STRLEN'den gelen;
char *pat = SvPVx(*++MARK, fromlen);
char *patent = pat + fromlen;
+ karakter *patkopya;
I32 uzunluk;
I32 veri türü;
SV * fromstr;

Ve döngüye başlamadan hemen önce, "patcopy"yi "pat"ın başlangıcı olarak ayarlayacağız:

öğeler = SP - MARK;
MARK++;
sv_setpvn(kedi, "", 0);
+ kopya = kopya;
while (pat < patent) {

Şimdi, dizenin başında bir "U" görürsek, "UTF8" bayrağını açarız.
çıktı SV, "cat":

+ if (veri türü == 'U' && pat==patcopy+1)
+ SvUTF8_on(kedi);
if (veri türü == '#') {
while (pat < patent && *pat != '\n')
pat++;

Dizenin ilk karakteri olduğu için "patcopy+1" olması gerektiğini unutmayın.
"Datumtype!" içine yutulan "U"

Hata, bir şeyi unuttuk: Ya kalıbın başında boşluklar varsa? "ambalaj("
U*", @stuff)", ilk olmasa da ilk aktif karakter olarak "U" olacak
desendeki şey. Bu durumda, "pat" ile birlikte "patcopy"yi ilerletmeliyiz.
boşluklara bakın:

if (isSPACE(veri türü))
devam;

olması gerekiyor

if (isSPACE(veri türü)) {
patkopi++;
devam;
}

TAMAM. C kısmı bitti. Şimdi bu yama yayınlanmadan önce iki ek şey yapmalıyız.
gitmeye hazır: Perl'in davranışını değiştirdik ve bu değişikliği belgelemeliyiz. Biz
ayrıca yamamızın çalıştığından ve çalışmadığından emin olmak için bazı regresyon testleri sağlamalıdır.
hat boyunca başka bir yerde bir hata yaratın.

Test yapmak the yama
Her operatör için regresyon testleri Tepe/ve böylece bir kopyasını çıkarıyoruz t/op/pack.t
için t/op/pack.t~. Artık testlerimizi sona ekleyebiliriz. İlk önce, "U"nun yaptığını test edeceğiz.
gerçekten Unicode dizeleri oluşturun.

t/op/pack.t mantıklı bir Tamam() işlev, ama olmasaydı, birini kullanabilirdik
t/test.pl.

'./test.pl' gerektirir;
plan( testler => 159 );

yani bunun yerine:

"1.20.300.4000" eq sprintf "%vd" olmadığı sürece 'değil' yazdırın,
pack("U*",1,20,300,4000);
"tamam $test\n" yazdır; $deneme++;

daha mantıklı yazabiliriz (tam bir açıklama için Test::More bölümüne bakın). dır-dir() ve diğeri
test fonksiyonları).

is( "1.20.300.4000", sprintf "%vd", pack("U*",1,20,300,4000),
"U* Unicode üretir" );

Şimdi, başlangıçtaki bu işi doğru anladığımızı test edeceğiz:

is( "1.20.300.4000", sprintf "%vd", paket(" U*",1,20,300,4000),
" başında boşluk olan" );

Ve son olarak, eğer "U" ise Unicode dizgileri yapmadığımızı test edeceğiz. değil ilk aktif
biçimi:

isnt(v1.20.300.4000, sprintf "%vd", paket("C0U*",1,20,300,4000),
"U* ilk değil Unicode değil" );

En üstte görünen test sayısını değiştirmeyi unutmamalısınız, yoksa
otomatik test cihazının kafası karışacak. Bu ya şöyle görünecek:

"1..156\n" yazdır;

veya bu:

plan( testler => 156 );

Şimdi Perl'i derliyoruz ve test takımında çalıştırıyoruz. Yeni testlerimiz geçti, yaşasın!

belgeleme the yama
Son olarak, belgeler. Evraklar bitene kadar iş asla bitmez, o halde hadi
az önce yaptığımız değişikliği açıklayın. İlgili yer pod/perlfunc.pod; tekrar, biz
bir kopya yapın ve ardından bu metni "paket" açıklamasına ekleyeceğiz:

=öğe *

Desen bir C ile başlıyorsa , elde edilen dize işlenir
UTF-8 kodlu Unicode olarak. Bir dizgede UTF-8 kodlamasını zorlayabilirsiniz
ilk C ile , ve takip eden baytlar şu şekilde yorumlanacaktır:
Unicode karakterler. Bunun olmasını istemiyorsan, başlayabilirsin.
C ile deseniniz (veya başka bir şey) Perl'i UTF-0'e zorlamamak için
dizginizi kodlayın ve ardından bunu bir C ile takip edin senin içinde bir yerde
desen.

Gönder
Bu yamanın nasıl gönderileceğiyle ilgili ayrıntılar için perlhack'e bakın.

onworks.net hizmetlerini kullanarak perlhacktut'u çevrimiçi kullanın


Ücretsiz Sunucular ve İş İstasyonları

Windows ve Linux uygulamalarını indirin

Linux komutları

Ad