EnglishFrenchGermanItalianPortugueseRussianSpanish

perlhacktut - онлайн у хмарі

OnWorks favicon

Run perlhacktut in OnWorks free hosting provider over Ubuntu Online, Fedora Online, Windows online emulator or MAC OS online emulator

Це команда perlhacktut, яку можна запустити в постачальнику безкоштовного хостингу OnWorks за допомогою однієї з наших численних безкоштовних робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн емулятор Windows або онлайн емулятор MAC OS

ПРОГРАМА:

ІМ'Я


perlhacktut - Пройдіть через створення простого виправлення коду C

ОПИС


Цей документ покаже вам простий приклад виправлення.

Якщо ви ще не читали perlhack, зробіть це спочатку! Ви також можете прочитати
perlsource теж.

Коли ви закінчите тут, перегляньте perlhacktips далі.

приклад OF A ПРОСТО PATCH


Давайте візьмемо простий патч від початку до кінця.

Ось що запропонував Ларрі: якщо "U" є першим активним форматом під час "pack",
(наприклад, "pack "U3C8", @stuff"), тоді отриманий рядок слід розглядати як UTF-8
закодований.

Якщо ви працюєте з клоном git репозиторію Perl, вам захочеться створити файл a
відділення для ваших змін. Це значно спростить створення відповідного патча. Див
perlgit, щоб дізнатися більше про те, як це зробити.

писемність ділянку
Як ми підготуємось, щоб це виправити? Спочатку ми знаходимо відповідний код - "пакет"
відбувається під час виконання, тому воно буде в одному з pp файли. Звичайно, "pp_pack" є
in п.п. Оскільки ми збираємося змінювати цей файл, давайте скопіюємо його до pp.c~.

[Ну, це було в п.п коли був написаний цей посібник. Зараз воно відокремлено з
"pp_unpack" у власний файл, pp_pack.c]

Тепер давайте подивимося на "pp_pack": ми беремо шаблон у "pat", а потім наводимо цикл на
шаблон, перетворюючи кожен символ формату по черзі в "datum_type". Потім для кожного можливого
символ форматування, ми поглинаємо інші аргументи шаблону (ширина поля, an
зірочка тощо) і перетворити наступний фрагмент введення у вказаний формат, додавши його
на вихід СВ «кішка».

Як ми знаємо, чи є "U" першим форматом у "пат"? Ну, якщо у нас є вказівник
початок "пат", то, якщо ми бачимо "U", ми можемо перевірити, чи ми все ще на початку
струна. Отже, ось де налаштовано «пат»:

STRLEN відлен;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
I32 лінза;
I32 тип датуму;
СВ *відстр;

У нас буде ще один рядковий покажчик:

STRLEN відлен;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
+ char *patcopy;
I32 лінза;
I32 тип датуму;
СВ *відстр;

І безпосередньо перед тим, як ми розпочнемо цикл, ми встановимо «patcopy» як початок «pat»:

пункти = SP - MARK;
MARK++;
sv_setpvn(кішка, "", 0);
+ patcopy = погладжувати;
поки (пат <патент) {

Тепер, якщо ми бачимо «U», яка була на початку рядка, ми вмикаємо прапор «UTF8» для
вихід SV, "кішка":

+ if (datumtype == 'U' && pat==patcopy+1)
+ SvUTF8_on(кішка);
if (datumtype == '#') {
while (пат <патент && *пат != '\n')
pat++;

Пам'ятайте, що це має бути "patcopy+1", оскільки перший символ рядка - це
"U", яке було проковтнуто в "datumtype!"

Ой, ми забули одну річ: що, якщо на початку шаблону є пробіли? "упакувати ("
U*", @stuff)" матиме "U" як перший активний символ, навіть якщо він не перший
річ у візерунку. У цьому випадку ми повинні передувати «patcopy» разом із «pat», коли ми
дивитися пробіли:

якщо (є ПРОБІЛ (тип даних))
continue;

потрібно стати

якщо (isSPACE(datumtype)) {
Patcopy++;
continue;
}

В ПОРЯДКУ. Ось і частина C виконана. Тепер ми повинні зробити дві додаткові речі, перш ніж з’явиться цей патч
готовий до роботи: ми змінили поведінку Perl, і тому ми повинні задокументувати цю зміну. ми
також має надати ще кілька регресійних тестів, щоб переконатися, що наш патч працює, а ні
створити помилку в іншому місці на лінії.

Тестування ділянку
Регресійні тести для кожного оператора діють t/op/, і ми робимо копію т/оп/уп.т
до t/op/pack.t~. Тепер ми можемо додати наші тести в кінці. По-перше, ми перевіримо, що робить «U».
дійсно створювати рядки Unicode.

t/op/pack.t має розумний в порядку() функцію, але якби це не було, ми могли б використати одну з
т/тест.пл.

вимагати './test.pl';
план( тести => 159 );

тому замість цього:

друкувати 'not ', якщо "1.20.300.4000" eq sprintf "%vd",
pack("U*",1,20,300,4000);
надрукувати "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),
"з пробілами на початку" );

І нарешті ми перевіримо, що ми не створюємо рядки Unicode, якщо «U» є НЕ перший активний
формат:

isnt( v1.20.300.4000, sprintf "%vd", pack("C0U*",1,20,300,4000),
"U* не перший не Unicode" );

Не забудьте змінити кількість тестів, яка відображається вгорі, або ж
автоматизований тестер заплутається. Це буде виглядати так:

надрукувати «1..156\n»;

або це:

план( тести => 156 );

Тепер ми збираємо Perl і запускаємо його через пакет тестів. Наші нові тести пройшли, ура!

Документування ділянку
Нарешті, документація. Робота ніколи не буде виконана, поки не закінчиться оформлення документів, тож давайте
опишіть зміни, які ми щойно внесли. Відповідне місце є pod/perlfunc.pod; знову ми
зробіть копію, а потім ми вставимо цей текст в опис "pack":

=пункт *

Якщо шаблон починається з C , буде оброблено отриманий рядок
як Unicode із кодуванням UTF-8. Ви можете примусово ввімкнути кодування UTF-8 у рядку
з початковою буквою C , а наступні байти будуть інтерпретуватися як
Символи Юнікоду. Якщо ви не хочете, щоб це сталося, ви можете почати
ваш шаблон із C (або що-небудь ще), щоб змусити Perl не використовувати UTF-0
закодуйте свій рядок, а потім дотримуйтеся цього символом C десь у вашому
рисунок.

Надіслати
Дивіться perlhack, щоб дізнатися більше про те, як надіслати цей патч.

Використовуйте perlhacktut онлайн за допомогою служб onworks.net



Найновіші онлайн-програми для Linux і Windows