perlhacktut - Dalam Talian di Awan

Ini ialah arahan perlhacktut yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.

JADUAL:

NAMA


perlhacktut - Berjalan melalui penciptaan tampung kod C mudah

DESCRIPTION


Dokumen ini membawa anda melalui contoh tampalan mudah.

Jika anda belum membaca perlhack lagi, lakukan itu dahulu! Anda juga mungkin mahu membacanya
perlsource juga.

Setelah anda selesai di sini, lihat perlhacktips seterusnya.

CONTOH OF A MUDAH PATCH


Mari kita ambil tampalan mudah dari awal hingga akhir.

Berikut ialah sesuatu yang dicadangkan oleh Larry: jika "U" ialah format aktif pertama semasa "pek",
(contohnya, "pek "U3C8", @stuff") maka rentetan yang terhasil hendaklah dianggap sebagai UTF-8
dikodkan.

Jika anda bekerja dengan klon git repositori Perl, anda akan mahu mencipta a
cawangan untuk perubahan anda. Ini akan menjadikan membuat tampalan yang betul lebih mudah. Lihat
perlgit untuk butiran tentang cara melakukan ini.

Penulisan yang tampalan
Bagaimanakah kita bersedia untuk membetulkan perkara ini? Mula-mula kita mencari kod yang dimaksudkan - "pek"
berlaku pada masa larian, jadi ia akan berada dalam salah satu daripada pp fail. Sudah tentu, "pp_pack" adalah
in hlm.c. Memandangkan kita akan mengubah fail ini, mari kita salin ke hlm.c~.

[Nah, sudah masuk hlm.c apabila tutorial ini ditulis. Ia kini telah dipisahkan dengan
"pp_unpack" ke failnya sendiri, pp_pack.c]

Sekarang mari kita lihat "pp_pack": kita ambil corak ke dalam "tepuk", dan kemudian gelung di atas
corak, mengambil setiap aksara format menjadi "datum_type". Kemudian untuk setiap yang mungkin
format aksara, kita menelan argumen lain dalam corak (lebar medan, an
asterisk, dan sebagainya) dan tukar input bongkah seterusnya ke dalam format yang ditentukan, menambahnya
ke output SV "cat".

Bagaimanakah kita tahu jika "U" ialah format pertama dalam "tepuk"? Nah, jika kita mempunyai penunjuk ke
permulaan "tepuk" kemudian, jika kita melihat "U" kita boleh menguji sama ada kita masih di permulaan
rentetan itu. Jadi, di sinilah "tepuk" disediakan:

STRLEN fromlen;
char *tepuk = SvPVx(*++MARK, fromlen);
char *patend = tepuk + fromlen;
I32 len;
I32 datumtype;
SV *fromstr;

Kami akan mempunyai penuding rentetan lain di sana:

STRLEN fromlen;
char *tepuk = SvPVx(*++MARK, fromlen);
char *patend = tepuk + fromlen;
+ char *patcopy;
I32 len;
I32 datumtype;
SV *fromstr;

Dan sebelum kita memulakan gelung, kita akan menetapkan "patcopy" sebagai permulaan "pat":

item = SP - MARKAH;
MARKAH++;
sv_setpvn(kucing, "", 0);
+ patcopy = tepuk;
sambil (tepuk < patend) {

Sekarang jika kita melihat "U" yang berada di permulaan rentetan, kita menghidupkan bendera "UTF8" untuk
SV keluaran, "kucing":

+ if (datumtype == 'U' && pat==patcopy+1)
+ SvUTF8_on(kucing);
if (jenis datum == '#') {
sambil (tepuk < patend && *tepuk != '\n')
tepuk++;

Ingat bahawa ia mestilah "patcopy+1" kerana aksara pertama rentetan ialah
"U" yang telah ditelan menjadi "datumtype!"

Oops, kami terlupa satu perkara: bagaimana jika terdapat ruang pada permulaan corak? "pek("
U*", @stuff)" akan mempunyai "U" sebagai aksara aktif pertama, walaupun ia bukan yang pertama
perkara dalam corak. Dalam kes ini, kita perlu memajukan "patcopy" bersama-sama dengan "pat" apabila kita
lihat ruang:

jika (isSPACE(datumtype))
teruskan;

perlu menjadi

if (isSPACE(datumtype)) {
patcopy++;
teruskan;
}

OKEY. Itu bahagian C selesai. Sekarang kita mesti melakukan dua perkara tambahan sebelum tampalan ini
sedia untuk pergi: kami telah mengubah tingkah laku Perl, jadi kami mesti mendokumentasikan perubahan itu. Kami
mesti juga menyediakan beberapa lagi ujian regresi untuk memastikan tampung kami berfungsi dan tidak
buat pepijat di tempat lain di sepanjang baris.

Ujian yang tampalan
Ujian regresi untuk setiap operator hidup dalam t/op/, dan oleh itu kami membuat salinan t/op/pack.t
kepada t/op/pack.t~. Sekarang kita boleh menambah ujian kita ke penghujung. Mula-mula, kami akan menguji bahawa "U" berfungsi
memang buat rentetan Unicode.

t/op/pack.t mempunyai akal okey() fungsi, tetapi jika tidak, kita boleh menggunakan yang dari
t/test.pl.

memerlukan './test.pl';
plan( ujian => 159 );

jadi bukannya ini:

cetak 'bukan' melainkan "1.20.300.4000" eq sprintf "%vd",
pek("U*",1,20,300,4000);
cetak "ok $test\n"; $test++;

kita boleh menulis yang lebih masuk akal (lihat Ujian::Lagi untuk penjelasan penuh tentang ialah() dan lain-lain
fungsi ujian).

ialah( "1.20.300.4000", sprintf "%vd", pek("U*",1,20,300,4000),
"U* menghasilkan Unicode" );

Sekarang kami akan menguji bahawa kami mempunyai perniagaan ruang-pada-permulaan dengan betul:

ialah( "1.20.300.4000", sprintf "%vd", pek("U*",1,20,300,4000),
" dengan ruang pada permulaan" );

Dan akhirnya kami akan menguji bahawa kami tidak membuat rentetan Unicode jika "U" adalah tidak yang pertama aktif
format:

isnt( v1.20.300.4000, sprintf "%vd", pack("C0U*",1,20,300,4000),
"U* bukan yang pertama bukan Unicode" );

Jangan lupa untuk menukar bilangan ujian yang muncul di bahagian atas, atau sebaliknya
penguji automatik akan keliru. Ini sama ada akan kelihatan seperti ini:

cetak "1..156\n";

Atau ini:

plan( ujian => 156 );

Kami kini menyusun Perl, dan menjalankannya melalui suite ujian. Ujian baharu kami lulus, hore!

Mendokumentasikan yang tampalan
Akhir sekali, dokumentasi. Kerja tidak pernah selesai sehingga kertas kerja selesai, jadi mari
terangkan perubahan yang baru kita buat. Tempat yang berkaitan ialah pod/perlfunc.pod; sekali lagi, kami
buat salinan, dan kemudian kami akan memasukkan teks ini dalam perihalan "pek":

=item *

Jika corak bermula dengan C , rentetan yang terhasil akan dirawat
sebagai Unicode berkod UTF-8. Anda boleh memaksa pengekodan UTF-8 dihidupkan dalam rentetan
dengan huruf awal C , dan bait yang mengikuti akan ditafsirkan sebagai
aksara Unikod. Jika anda tidak mahu perkara ini berlaku, anda boleh mulakan
corak anda dengan C (atau apa-apa lagi) untuk memaksa Perl tidak menggunakan UTF-0
mengekod rentetan anda, dan kemudian ikuti ini dengan C di suatu tempat dalam anda
.

Hantar
Lihat perlhack untuk mendapatkan butiran tentang cara menyerahkan patch ini.

Gunakan perlhacktut dalam talian menggunakan perkhidmatan onworks.net



Program dalam talian Linux & Windows terkini