این دستور perlhacktut است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.
برنامه:
نام
perlhacktut - ایجاد یک وصله کد ساده C را طی کنید
شرح
این سند شما را از طریق یک نمونه پچ ساده راهنمایی می کند.
اگر هنوز perlhack را نخوانده اید، ابتدا این کار را انجام دهید! همچنین ممکن است بخواهید کامل بخوانید
پرل سورس نیز
پس از پایان کار در اینجا، perlhacktips بعدی را بررسی کنید.
مثال OF A SIMPLE صفحه
بیایید یک پچ ساده از ابتدا تا انتها بگیریم.
این چیزی است که لری پیشنهاد کرد: اگر "U" اولین فرمت فعال در طول یک "pack" باشد،
(به عنوان مثال، "pack "U3C8"، @stuff") سپس رشته حاصل باید به عنوان UTF-8 در نظر گرفته شود
کد گذاری شده است.
اگر با یک کلون git از مخزن Perl کار می کنید، می خواهید a ایجاد کنید
شعبه برای تغییرات شما این کار ایجاد یک پچ مناسب را بسیار ساده تر می کند. را ببینید
perlgit برای جزئیات نحوه انجام این کار.
نوشته la وصله
چگونه برای رفع این مشکل آماده شویم؟ ابتدا کد مورد نظر را پیدا می کنیم - "pack"
در زمان اجرا اتفاق می افتد، بنابراین در یکی از موارد خواهد بود pp فایل ها. مطمئناً، "pp_pack" است
in pp.c. از آنجایی که قصد داریم این فایل را تغییر دهیم، بیایید آن را در آن کپی کنیم pp.c~.
[خب، داخل بود pp.c زمانی که این آموزش نوشته شد در حال حاضر با تقسیم شده است
"pp_unpack" به فایل خودش، pp_pack.c]
حالا بیایید به "pp_pack" نگاه کنیم: یک الگو را به "pat" میگیریم و سپس روی آن حلقه میزنیم
الگو، هر کاراکتر فرمت را به نوبه خود به "datum_type" تبدیل می کند. سپس برای هر ممکن
کاراکتر قالب بندی، ما آرگومان های دیگر در الگو را می بلعیم (یک عرض فیلد، an
ستاره و غیره) و ورودی تکه بعدی را به فرمت مشخص شده تبدیل کنید و آن را اضافه کنید
بر روی خروجی SV "cat".
چگونه بفهمیم که "U" اولین فرمت در "pat" است؟ خوب، اگر اشاره ای به آن داشته باشیم
شروع "pat" سپس، اگر "U" را دیدیم، میتوانیم آزمایش کنیم که آیا هنوز در ابتدای آن هستیم یا خیر
رشته بنابراین، اینجا جایی است که "pat" تنظیم می شود:
STRLEN fromlen;
char *pat = SvPVx(*++MARK، fromlen);
char *patend = pat + fromlen;
I32 len;
نوع داده I32;
SV *fromstr;
ما یک نشانگر رشته دیگری در آنجا خواهیم داشت:
STRLEN fromlen;
char *pat = SvPVx(*++MARK، fromlen);
char *patend = pat + fromlen;
+ char *patcopy;
I32 len;
نوع داده I32;
SV *fromstr;
و درست قبل از شروع حلقه، "patcopy" را به عنوان شروع "pat" تنظیم می کنیم:
اقلام = SP - MARK;
MARK++;
sv_setpvn(cat, "", 0);
+ patcopy = pat;
while (pat < patend) {
حالا اگر یک "U" را دیدیم که در ابتدای رشته بود، پرچم "UTF8" را برای
خروجی SV، "cat":
+ if (نوع داده == 'U' && pat==patcopy+1)
+ SvUTF8_on(cat);
if (نوع داده == '#') {
while (pat < patend && *pat != '\n')
pat++;
به یاد داشته باشید که باید "patcopy+1" باشد زیرا اولین کاراکتر رشته عبارت است از
"U" که به "datumtype!"
اوه، ما یک چیز را فراموش کردیم: اگر در ابتدای الگو فاصله وجود داشته باشد چه؟ "بسته("
U*، @stuff)" "U" را به عنوان اولین شخصیت فعال خواهد داشت، حتی اگر اولین کاراکتر نباشد
چیزی در الگو در این صورت باید «patcopy» را در کنار «pat» پیش ببریم
فضاها را ببینید:
if (isSPACE (نوع داده))
ادامه هید؛
نیاز به تبدیل شدن دارد
if (isSPACE(نوع داده)) {
patcopy ++;
ادامه هید؛
}
خوب. این قسمت C انجام شده است. حالا باید قبل از اینکه این پچ شود دو کار اضافی انجام دهیم
آماده برای رفتن: ما رفتار پرل را تغییر دادیم، بنابراین باید آن تغییر را مستند کنیم. ما
همچنین باید چند تست رگرسیون بیشتری ارائه دهد تا مطمئن شویم که پچ ما کار می کند و نمی کند
یک اشکال در جای دیگری در طول خط ایجاد کنید.
تست la وصله
تست های رگرسیون برای هر اپراتور در حال اجرا هستند بالا/، و بنابراین ما یک کپی از t/op/pack.t
به t/op/pack.t~. حالا می توانیم تست های خود را به آخر اضافه کنیم. اول، ما آزمایش می کنیم که "U" انجام می دهد
در واقع رشته های یونیکد ایجاد کنید.
t/op/pack.t معقولی دارد خوب() عملکرد، اما اگر این کار را نمی کرد، می توانستیم از یکی از آن استفاده کنیم
t/test.pl.
نیاز به './test.pl';
طرح (تست => 159 );
بنابراین به جای این:
چاپ 'نه' مگر اینکه "1.20.300.4000" معادله sprintf "%vd"،
بسته ("U*"، 1,20,300,4000،XNUMX،XNUMX،XNUMX)؛
چاپ "ok $test\n"؛ $test++;
میتوانیم معقولتر بنویسیم (برای توضیح کامل به Test:: More مراجعه کنید است() و دیگر
توابع آزمایشی).
is("1.20.300.4000"، sprintf "%vd"، pack("U*",1,20,300,4000)
"U* Unicode تولید می کند")
اکنون ما آزمایش خواهیم کرد که این کسب و کار فضایی در ابتدای کار را درست انجام داده ایم:
is("1.20.300.4000"، sprintf "%vd"، pack("U*",1,20,300,4000)
"با فاصله در ابتدا")؛
و در نهایت ما آزمایش می کنیم که اگر "U" باشد رشته های یونیکد نمی سازیم نه اولین فعال
قالب:
isnt( v1.20.300.4000، sprintf "%vd"، pack("C0U*",1,20,300,4000)
"U* نه اول یونیکد نیست")
فراموش نکنید که تعداد تستهایی که در بالا ظاهر میشود را تغییر دهید، وگرنه
تستر خودکار گیج می شود. این یا شبیه این خواهد بود:
چاپ "1..156\n"؛
یا این:
طرح (تست => 156 );
اکنون Perl را کامپایل کرده و آن را از طریق مجموعه آزمایشی اجرا می کنیم. تست های جدید ما قبول شد، هورا!
مستند سازی la وصله
در نهایت، مستندات. کار هرگز انجام نمی شود تا زمانی که کار اداری تمام شود، پس بیایید
تغییری را که به تازگی ایجاد کرده ایم را شرح دهید. محل مربوطه است pod/perlfunc.pod; دوباره، ما
یک کپی تهیه کنید و سپس این متن را در توضیحات "pack" درج می کنیم:
= آیتم *
اگر الگو با C شروع شود ، رشته به دست آمده درمان می شود
به عنوان یونیکد با کد UTF-8. می توانید رمزگذاری UTF-8 را در یک رشته مجبور کنید
با C اولیه ، و بایت های بعدی به صورت تفسیر می شوند
کاراکترهای یونیکد اگر نمی خواهید این اتفاق بیفتد، می توانید شروع کنید
الگوی شما با C (یا هر چیز دیگری) تا پرل را مجبور به UTF-0 نکند
رشته خود را رمزگذاری کنید، و سپس این را با یک C دنبال کنید جایی در تو
الگوی.
ارسال
برای جزئیات نحوه ارسال این پچ به perlhack مراجعه کنید.
از perlhacktut آنلاین با استفاده از خدمات onworks.net استفاده کنید