Це команда perldebguts, яку можна запустити в постачальнику безкоштовного хостингу OnWorks за допомогою однієї з наших численних безкоштовних робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн- емулятор Windows або онлайн-емулятор MAC OS
ПРОГРАМА:
ІМ'Я
perldebguts - кишки налагодження Perl
ОПИС
Це не perldebug, який розповідає, як використовувати налагоджувач. Ця довідкова сторінка описує
низькорівневі деталі, що стосуються внутрішніх елементів налагоджувача, які варіюються від складних до
неможливо зрозуміти для тих, хто не дуже близький до нутрощів Perl.
Застереження лектора.
Отладчик Внутрішні
Perl має спеціальні гачки для налагодження під час компіляції та виконання, які використовуються для створення налагодження
середовища. Ці гачки не слід плутати з Perl -Dxxx команда, описана в
perlrun, який можна використовувати лише за умови створення спеціального Perl відповідно до інструкцій у файлі
ВСТАНОВИТИ podpage у дереві джерел Perl.
Наприклад, щоразу, коли ви викликаєте вбудовану функцію "виклик" Perl з пакета "DB",
аргументи, з якими був викликаний відповідний кадр стека, копіюються в
@DB:: масив аргументів. Ці механізми вмикаються шляхом виклику Perl за допомогою -d перемикач.
Зокрема, увімкнено такі додаткові функції (пор. "$^P" у perlvar):
· Perl вставляє вміст $ENV{PERL5DB} (або "BEGIN {require 'perl5db.pl'}", якщо ні
присутній) перед першим рядком вашої програми.
· Кожен масив "@{"_<$filename"}" містить рядки $filename для файлу, зібраного
Perl. Те саме стосується рядків "eval", які містять підпрограми або які
наразі виконуються. $filename для рядків "eval" виглядає як "(eval
34)".
Значення в цьому масиві є магічними в числовому контексті: вони порівнюються лише до нуля
якщо лінія не розривається.
· Кожен хеш "%{"_<$filename"}" містить точки зупинки та дії, які визначаються номером рядка.
Окремі записи (на відміну від усього хешу) можна налаштувати. Perl піклується тільки про
Логічне значення true тут, хоча значення, які використовуються perl5db.pl мають форму
"$break_condition\0$action".
Те ж саме стосується і оцінюваних рядків, які містять підпрограми або які є в даний момент
виконується. $filename для рядків "eval" виглядає як "(eval 34)".
· Кожен скаляр "${"_<$filename"}" містить "_<$filename". Це також стосується
оцінювані рядки, які містять підпрограми або які зараз виконуються.
$filename для рядків "eval" виглядає як "(eval 34)".
· Після компіляції кожного «потрібного» файлу, але до його виконання,
"DB::postponed(*{"_<$filename"})" викликається, якщо існує підпрограма "DB::postponed".
Тут $filename – це розширене ім’я файлу "require"d, яке знайдено у файлі
значення %INC.
· Після компіляції кожної підпрограми "subname" існування $DB::postponed{subname}
перевіряється. Якщо цей ключ існує, "DB::postponed(subname)" викликається, якщо
Також існує підпрограма "DB::postponed".
· Підтримується хеш %DB::sub, ключі якого є іменами підпрограм і чиї значення мають
форма "ім'я файлу: початкова лінія-кінцева лінія". "ім'я файлу" має форму "(eval 34)" для
підпрограми, визначені всередині "eval".
· Коли виконання вашої програми досягає точки, яка може утримувати точку зупину,
Підпрограма "DB::DB()" викликається, якщо будь-яка зі змінних $DB::trace, $DB::single або
Сигнал $DB:: вірний. Ці змінні не є "локальними" для визначення. Ця функція вимкнена
під час виконання всередині "DB::DB()", включаючи функції, викликані з нього, якщо "$^D &
(1<<30)" вірно.
· Коли виконання програми досягає виклику підпрограми, виклик &DB::sub(аргументи) є
замість цього зроблено з $DB::sub, що містить назву викликаної підпрограми. (Це ні
відбувається, якщо підпрограма була скомпільована в пакеті "DB".)
Якщо виклик здійснюється до підпрограми lvalue і визначено &DB::lsub &DB::lsub(аргументи) є
замість цього викликається, інакше повертаючись до &DB::sub(аргументи).
· Під час виконання програми використовується «goto» для введення підпрограми, що не є XS, і 0x80
біт встановлюється в $^P, виконується виклик &DB::goto, при цьому $DB::sub містить ім’я
вводиться підпрограма.
Зауважте, що якщо для роботи &DB::sub потрібні зовнішні дані, виклик підпрограми неможливий
без цього. Наприклад, &DB::sub стандартного налагоджувача залежить від $DB::deep
змінна (вона визначає, скільки рівнів рекурсії глибоко в налагоджувачі ви можете перейти до цього
обов'язкова перерва). Якщо $DB::deep не визначено, виклики підпрограм навіть неможливі
хоча &DB::sub існує.
писемність вашу Власний Отладчик
Навколишнє середовище Змінні
Змінну середовища "PERL5DB" можна використовувати для визначення налагоджувача. Наприклад,
мінімальний «робочий» відладчик (він фактично нічого не робить) складається з одного рядка:
під DB::DB {}
Його легко можна визначити так:
$ PERL5DB="sub DB::DB {}" perl -d your-script
Інший короткий налагоджувач, трохи більш корисний, можна створити лише за допомогою рядка:
sub DB::DB {print ++$i; скалярний }
Цей налагоджувач друкує число, яке збільшується для кожного зустрічного оператора та чекає
щоб ви натиснули новий рядок, перш ніж перейти до наступного оператора.
Насправді корисний такий налагоджувач:
{
пакет БД;
під БД {}
sub sub {print ++$i, " $sub\n"; &$sub}
}
Він друкує порядковий номер кожного виклику підпрограми та назву викликаної
підпрограма. Зауважте, що &DB::sub компілюється в пакет "DB" за допомогою
директива «пакет».
Коли він запускається, налагоджувач читає ваш файл rc (./.perldb or ~/.perldb під Unix), який
можна встановити важливі параметри. (Тут також можна визначити підпрограму (&afterinit); вона є
виконується після того, як налагоджувач завершить власну ініціалізацію.)
Після прочитання файлу rc налагоджувач зчитує змінну середовища PERLDB_OPTS і
використовує його для встановлення параметрів налагоджувача. Вміст цієї змінної розглядається так, ніби він був
аргумент команди налагоджувача "o ..." (qv у "Налаштуваних параметрах" у perldebug).
Отладчик Внутрішній Змінні
На додаток до змінних, пов'язаних з файлом і підпрограмою, згаданими вище, налагоджувач
також підтримує різні магічні внутрішні змінні.
· @DB::dbline є псевдонімом для "@{"::_
поточного вибраного файлу (зібраного Perl), або явно вибраного за допомогою
команду "f" налагоджувача або неявно шляхом виконання.
Значення в цьому масиві є магічними в числовому контексті: вони порівнюються лише до нуля
якщо лінія не розривається.
· %DB::dbline є псевдонімом для "%{"::_
дії, визначені номером рядка у поточному вибраному файлі, або вибрано явно
за допомогою команди «f» налагоджувача або неявно шляхом виконання.
Як зазначалося раніше, окремі записи (на відміну від усього хешу) можна встановити.
Perl тут дбає лише про Boolean true, хоча значення, які використовуються perl5db.pl мати
форму "$break_condition\0$action".
Отладчик настройка Функції
Деякі функції надаються для спрощення налаштування.
· Див. «Настроювані параметри» в perldebug для опису параметрів, які аналізує
"DB::parse_options(рядок)".
· "DB::dump_trace(skip[,count])" пропускає вказану кількість кадрів і повертає список
містить інформацію про кадри виклику (усі вони, якщо "count" відсутній).
Кожен запис є посиланням на хеш з ключами "контекст" (або ".", "$", або "@"), "суб"
(ім'я підпрограми або інформація про "eval"), "args" ("undef" або посилання на масив),
"файл" і "рядок".
· "DB::print_trace(FH, skip[, count[, short]])" друкує відформатовану інформацію про абонента
рами. Останні дві функції можуть бути зручними як аргументи для команд «<», «<<».
Зауважте, що будь-які змінні та функції, які не задокументовані в цій довідковій сторінці (або в
perldebug) розглядаються лише для внутрішнього використання, і тому можуть бути змінені без них
повідомлення.
Кадр Listing Вихід прикладів
Опцію «кадр» можна використовувати для керування виведенням інформації про кадр. Наприклад,
порівняйте цей слід виразу:
$perl -де 42
Дамп стека під час матриці ввімкнено за межами evals.
Завантаження програм БД з рівня виправлення perl5db.pl 0.94
Доступна підтримка Emacs.
Введіть h або 'hh' для довідки.
головний::(-e:1): 0
DB<1> sub foo { 14 }
DB<2> підрядка { 3 }
DB<3> t print foo() * bar()
main::((eval 172):3): надрукувати foo() + bar();
main::foo((eval 168):2):
main::bar((eval 170):2):
42
з цією, як тільки встановлено параметр "o"frame=2:
DB<4> of=2
кадр = '2'
DB<5> t print foo() * bar()
3: foo() * bar()
введення main::foo
2: sub foo { 14 };
вийшов з main::foo
введення main::bar
2: підрядка { 3 };
вийшов з main::bar
42
Для демонстрації нижче ми представляємо важкий список, отриманий у результаті налаштування вашого
Змінна середовища "PERLDB_OPTS" до значення "f=n N", і працює Perl -d -V від
командний рядок. Наведено приклади використання різних значень "n", щоб дати вам відчуття
різниця між налаштуваннями. Хоча це може бути довго, це не повний список, але
лише уривки.
1.
введення main::BEGIN
введення Config::BEGIN
Пакет lib/Exporter.pm.
Пакет lib/Carp.pm.
Пакет lib/Config.pm.
введення Config::TIEHASH
введення Exporter::import
введення Exporter::export
введення Config::myconfig
введення Config::FETCH
введення Config::FETCH
введення Config::FETCH
введення Config::FETCH
2.
введення main::BEGIN
введення Config::BEGIN
Пакет lib/Exporter.pm.
Пакет lib/Carp.pm.
вийшов із Config::BEGIN
Пакет lib/Config.pm.
введення Config::TIEHASH
вийшов із Config::TIEHASH
введення Exporter::import
введення Exporter::export
вийшов із Exporter::export
Exporter::import вийшов
вийшов з main::BEGIN
введення Config::myconfig
введення Config::FETCH
вийшов із Config::FETCH
введення Config::FETCH
вийшов із Config::FETCH
введення Config::FETCH
3.
в $=main::BEGIN() з /dev/null:0
в $=Config::BEGIN() з lib/Config.pm:2
Пакет lib/Exporter.pm.
Пакет lib/Carp.pm.
Пакет lib/Config.pm.
в $=Config::TIEHASH('Config') з lib/Config.pm:644
в $=Exporter::import('Config', 'myconfig', 'config_vars') з /dev/null:0
у $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') з li
в @=Config::myconfig() з /dev/null:0
в $=Config::FETCH(ref(Config), 'package') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'baserev') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'PERL_VERSION') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'osname') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'osvers') з lib/Config.pm:574
4.
в $=main::BEGIN() з /dev/null:0
в $=Config::BEGIN() з lib/Config.pm:2
Пакет lib/Exporter.pm.
Пакет lib/Carp.pm.
out $=Config::BEGIN() з lib/Config.pm:0
Пакет lib/Config.pm.
в $=Config::TIEHASH('Config') з lib/Config.pm:644
out $=Config::TIEHASH('Config') з lib/Config.pm:644
в $=Exporter::import('Config', 'myconfig', 'config_vars') з /dev/null:0
у $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') з lib/
out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') з lib/
out $=Exporter::import('Config', 'myconfig', 'config_vars') з /dev/null:0
out $=main::BEGIN() з /dev/null:0
в @=Config::myconfig() з /dev/null:0
в $=Config::FETCH(ref(Config), 'package') з lib/Config.pm:574
out $=Config::FETCH(ref(Config), 'package') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'baserev') з lib/Config.pm:574
out $=Config::FETCH(ref(Config), 'baserev') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'PERL_VERSION') з lib/Config.pm:574
out $=Config::FETCH(ref(Config), 'PERL_VERSION') з lib/Config.pm:574
в $=Config::FETCH(ref(Config), 'PERL_SUBVERSION') з lib/Config.pm:574
5.
в $=main::BEGIN() з /dev/null:0
в $=Config::BEGIN() з lib/Config.pm:2
Пакет lib/Exporter.pm.
Пакет lib/Carp.pm.
out $=Config::BEGIN() з lib/Config.pm:0
Пакет lib/Config.pm.
в $=Config::TIEHASH('Config') з lib/Config.pm:644
out $=Config::TIEHASH('Config') з lib/Config.pm:644
в $=Exporter::import('Config', 'myconfig', 'config_vars') з /dev/null:0
у $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') з lib/E
out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') з lib/E
out $=Exporter::import('Config', 'myconfig', 'config_vars') з /dev/null:0
out $=main::BEGIN() з /dev/null:0
в @=Config::myconfig() з /dev/null:0
в $=Config::FETCH('Config=ХАШ(0x1aa444)', 'пакет') з lib/Config.pm:574
out $=Config::FETCH('Config=ХАШ(0x1aa444)', 'пакет') з lib/Config.pm:574
в $=Config::FETCH('Config=ХАШ(0x1aa444)', 'baserev') з lib/Config.pm:574
out $=Config::FETCH('Config=ХАШ(0x1aa444)', 'baserev') з lib/Config.pm:574
6.
в $=КОД(0x15eca4)() з /dev/null:0
в $=КОД(0x182528)() з lib/Config.pm:2
Пакет lib/Exporter.pm.
з $=КОД(0x182528)() з lib/Config.pm:0
скалярний контекст повернення з КОД(0x182528): undef
Пакет lib/Config.pm.
в $=Config::TIEHASH('Config') з lib/Config.pm:628
out $=Config::TIEHASH('Config') з lib/Config.pm:628
скалярний контекст повернення з Config::TIEHASH: порожній хеш
в $=Exporter::import('Config', 'myconfig', 'config_vars') з /dev/null:0
в $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') з lib/Exporter.pm:171
out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') з lib/Exporter.pm:171
скалярний контекст повернення від Exporter::export: ''
out $=Exporter::import('Config', 'myconfig', 'config_vars') з /dev/null:0
скалярний контекст повернення від Exporter::import: ''
У всіх випадках, показаних вище, відступ рядка показує дерево викликів. Якщо біт 2 "кадри"
встановлено, рядок також друкується при виході з підпрограми. Якщо встановлено біт 4,
аргументи друкуються разом з інформацією про абонента. Якщо встановлено біт 8, аргументи є
надруковані, навіть якщо вони пов'язані або посилання. Якщо встановлено біт 16, повертається значення
також надруковані.
Коли пакет компілюється, рядок виглядає так
Пакет lib/Carp.pm.
друкується з належним відступом.
Налагодження регулярний Вирази
Є два способи ввімкнути вихід налагодження для регулярних виразів.
Якщо ваш perl скомпільовано з "-DDEBUGGING", ви можете використовувати -Доктор прапорець у командному рядку.
В іншому випадку можна «використовувати re 'debug'», що має ефекти під час компіляції та виконання.
Починаючи з Perl 5.9.5, ця прагма має лексичну область.
Час компіляції Вихід
Результати налагодження під час компіляції виглядають так:
Компіляція REx '[bc]d(ef*g)+h[ij]k$'
розмір 45 Отримано 364 байти для анотацій зміщення.
спочатку в 1
найрідкісніший char g на 0
найрідкісніший символ d на 0
1: БУДЬ-ЯКІ[bc](12)
12: ТОЧНО (14)
14: CURLYX[0] {1,32767}(28)
16: ВІДКРИТИ1(18)
18: ТОЧНО (20)
20: ЗІРКА(23)
21: ТОЧНО (0)
23: ТОЧНО (25)
25: ЗАКРИТИ1(27)
27: WHILEM[1/1](0)
28: НІЧОГО(29)
29: ТОЧНО (31)
31: ANYOF[ij](42)
42: ТОЧНО (44)
44: EOL(45)
45: END(0)
прив’язаний 'de' на 1 плаваючий 'gh' на 3..2147483647 (перевірка плаваючого)
stclass 'ANYOF[bc]' minlen 7
Зміщення: [45]
1[4] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 5[1]
0[0] 12[1] 0[0] 6[1] 0[0] 7[1] 0[0] 9[1] 8[1] 0[0] 10[1] 0[0]
11[1] 0[0] 12[0] 12[0] 13[1] 0[0] 14[4] 0[0] 0[0] 0[0] 0[0]
0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 18[1] 0[0] 19[1] 20[0]
Пропускаємо підтримку $` $& $'.
Перший рядок показує попередньо скомпільовану форму регулярного виразу. Другий показує розмір
скомпільована форма (у довільних одиницях, зазвичай 4-байтові слова) і загальна кількість байтів
призначений для таблиці зміщення/довжини, зазвичай 4+"розмір"*8. Наступний рядок показує етикетку
id першого вузла, який виконує збіг.
Команда
прив’язаний 'de' на 1 плаваючий 'gh' на 3..2147483647 (перевірка плаваючого)
stclass 'ANYOF[bc]' minlen 7
рядок (розбитий на два рядки вище) містить інформацію про оптимізатор. У наведеному прикладі
оптимізатор виявив, що відповідність має містити підрядок "de" зі зміщенням 1 плюс
підрядок "gh" з деяким зміщенням від 3 до нескінченності. Крім того, при перевірці на них
підрядки (щоб швидко відмовитися від неможливих збігів), Perl перевірить наявність підрядка "gh"
перед перевіркою підрядка "de". Оптимізатор також може використовувати знання про те, що
матч починається (з «першого» id) з класом символів і не меншим за 7 рядків
символи можуть збігатися.
Сфери інтересів, які можуть з’явитися в цьому рядку
"закріплений" STRING "в" POS
"плаваючий" STRING "в" POS1..POS2
Дивись вище.
"відповідність плаваючий/заякорений"
Який підрядок перевірити першим.
"мінлен"
Мінімальна довжина матчу.
"stclass" TYPE
Тип першого відповідного вузла.
"noscan"
Не скануйте знайдені підрядки.
"ізалл"
Означає, що інформація оптимізатора – це все, що містить регулярний вираз, і
таким чином, не потрібно взагалі вводити механізм регулярних виразів.
"GPOS"
Встановіть, якщо шаблон містить "\G".
"плюс"
Встановіть, якщо шаблон починається з повторюваного символу (як у "x+y").
"неявний"
Встановіть, якщо шаблон починається з ".*".
"з оцінкою"
Встановіть, якщо шаблон містить eval-групи, наприклад "(?{ code })" і "(??{ code })".
"заякор (TYPE)"
Якщо шаблон може збігатися лише в кількох місцях, при цьому "TYPE" є "SBOL",
«MBOL» або «GPOS». Дивіться таблицю нижче.
Якщо відомо, що підрядок відповідає лише в кінці рядка, за ним може стояти «$», як у
"плаваючі 'k'$".
Спеціальна інформація оптимізатора використовується, щоб уникнути введення (повільного) механізму регулярних виразів
рядки, які точно не збігаються. Якщо встановлено прапор «isall», виклик регулярного виразу
двигуна можна уникнути, навіть якщо оптимізатор знайшов відповідне місце для збігу.
Над розділом оптимізатора знаходиться список вузли скомпільованої форми регулярного виразу. Кожен
рядок має формат
""id: TYPE НЕОБОВ’ЯЗКОВО-ІНФОРМАЦІЯ (наступний ідентифікатор)
типи of Nodes
Ось поточні можливі типи з коротким описом:
# ТИП arg-description [num-args] [longjump-len] ОПИС
# Точки виходу
END no Кінець програми.
SUCCEED немає повернення з підпрограми, в основному.
# Якоря початку лінії:
SBOL не відповідає "" на початку рядка: /^/, /\A/
MBOL ні Те саме, припускаючи багаторядковість: /^/m
# Якоря кінця лінії:
SEOL не відповідає "" в кінці рядка: /$/
MEOL ні Те саме, якщо припустити багаторядковість: /$/m
EOS не відповідає "" в кінці рядка: /\z/
# Якорі початку матчу:
GPOS немає. Збігається з місцем, де закінчився останній m//g.
# Коди операції межі слова:
BOUND ні Як BOUNDA для не-utf8, інакше відповідати ""
між будь-яким Unicode \w\W або \W\w
BOUNDL ні Як BOUND/BOUNDU, але \w і \W визначені
за поточною місцевістю
BOUNDU немає відповідності "" на будь-якій межі заданого типу
використовуючи правила Unicode
BOUNDA немає відповідності "" на будь-якій межі між \w\W або
\W\w, де \w є [_a-zA-Z0-9]
NBOUND ні Як NBOUNDA для не-utf8, інакше збігається
"" між будь-яким Unicode \w\w або \W\W
NBOUNDL ні Як NBOUND/NBOUNDU, але \w і \W є
визначено поточним мовним стандартом
NBOUNDU немає відповідності "" на будь-якій межі заданого типу
використання правил Unicode
NBOUNDA немає відповідності "" між будь-якими \w\w або \W\W, де \w
є [_a-zA-Z0-9]
# [Спеціальні] альтернативи:
REG_ANY не відповідає жодному символу (крім нового рядка).
SANY не відповідає жодному символу.
CANY не відповідає жодному байту.
ANYOF sv 1 Збіг символів у (або не в) цьому класі,
збігається лише один символ
ANYOFL sv 1 Як і NYOF, але /l діє
# Класи символів POSIX:
POSIXD немає Деякі [[:class:]] під /d; поле FLAGS
дає який
POSIXL немає Деякі [[:class:]] під /l; поле FLAGS
дає який
POSIXU немає Деякі [[:class:]] під /u; поле FLAGS
дає який
POSIXA немає Деякі [[:class:]] під /a; поле FLAGS
дає який
NPOSIXD немає доповнення до POSIXD, [[:^class:]]
NPOSIXL немає доповнення до POSIXL, [[:^class:]]
NPOSIXU немає доповнення до POSIXU, [[:^class:]]
NPOSIXA немає доповнення до POSIXA, [[:^class:]]
CLUMP no Відповідає будь-якій розширеній послідовності кластера графем
# Чергування
# ГІЛКА Набір гілок, що становлять один вибір, є
# підключено разом із їхніми вказівниками "наступний", оскільки
# пріоритет запобігає з’єднанню будь-чого
# будь-яка окрема гілка. «Наступний» покажчик останнього
# ГІЛКА у виборі вказує на предмет, наступний за
# повний вибір. Тут також фінальний "наступний"
# покажчик кожної окремої точки розгалуження; кожна гілка
# починається з вузла операнда вузла BRANCH.
#
Вузол BRANCH Знайдіть відповідність цій альтернативі або наступному...
# Літерали
EXACT str. Відповідає цьому рядку (перед довжиною).
EXACTL str Як і EXACT, але /l діє.
EXACTF str Збігається з цим рядком, відмінним від UTF-8 (не гарантується
для складання) за допомогою правил /id (w/len).
EXACTFL str Відповідає цьому рядку (не гарантується
складений) за допомогою правил /il (w/len).
EXACTFU str Знайти цей рядок (згорнутий iff в UTF-8,
довжина в складання не змінюється, якщо не в
UTF-8) за допомогою правил /iu (w/len).
EXACTFA str Відповідає цьому рядку (не гарантується
складений) за допомогою правил /iaa (w/len).
EXACTFU_SS str Знайти цей рядок (згорнутий iff в UTF-8,
довжина в складання може змінитися, навіть якщо не в
UTF-8) за допомогою правил /iu (w/len).
EXACTFLU8 str Рідкісні обставини: як EXACTFU, але є
під /l, UTF-8, складено, і все в
це вище 255.
EXACTFA_NO_TRIE str Знайти цей рядок (який не можна спробувати;
не гарантовано згортання) за допомогою /iaa
правила (w/len).
# Типи нічого не робити
NOTHING no Збіг пустий рядок.
# Варіант вище, який розмежовує групу, таким чином зупиняє оптимізацію
TAIL no Match порожній рядок. Можна стрибати звідси
зовні.
# Петлі
# ЗІРКА,ПЛЮС '?' і складні '*' і '+' реалізуються як
# кругові структури BRANCH. Прості випадки
# (один символ на збіг) реалізовано за допомогою STAR
# і PLUS для швидкості та мінімізації рекурсивних занурень.
#
Вузол STAR Зіставте цю (просту) річ 0 або більше разів.
Вузол PLUS Установіть відповідність до цієї (простої) речі 1 або більше разів.
CURLY sv 2 З’єднайте цю просту річ {n,m} разів.
CURLYN № 2 Зніміть наступний після цієї простої речі
CURLYM № 2 Зніміть цю середню складну річ {n,m}
раз.
CURLYX sv 2 З’єднайте цю складну річ {n,m} разів.
# Цей термінатор створює циклову структуру для CURLYX
WHILEM no Виконайте обробку фігурних елементів і подивіться, чи відповідає решта.
# Пов'язаний з буфером
# OPEN,CLOSE,GROUPP ...нумеруються під час компіляції.
OPEN num 1 Позначте цю точку у вводі як початок #n.
CLOSE num 1 Аналогічно ВІДКРИТИ.
REF num 1 Установіть відповідність деякому вже збіганому рядку
REFF num 1 Відповідає вже збіганому рядку, складеному за допомогою
власні правила кодування для не-utf8
REFFL num 1 Збігається з уже відповідним рядком, складеним у місце.
REFFU num 1 Відповідає вже збіганому рядку, складеному за допомогою
правила Unicode для не-utf8
REFFA num 1 Підібрати вже відповідний рядок, складений за допомогою
правила Unicode для не-utf8, без змішування ASCII,
не ASCII
# Іменовані посилання. Код у regcomp.c припускає, що все це слід
# пронумеровані посилання
NREF no-sv 1 Знайдіть відповідний рядок
NREFF no-sv 1 Відповідає вже збіганому рядку, складеному за допомогою
власні правила кодування для не-utf8
NREFFL no-sv 1 Збіг уже збіганий рядок, складений у місце.
NREFFU num 1 Відповідає вже збіганому рядку, складеному за допомогою
правила Unicode для не-utf8
NREFFA num 1 Підібрати вже відповідний рядок, складений за допомогою
правила Unicode для не-utf8, без змішування ASCII,
не ASCII
# Підтримка довгого RE
LONGJMP вимкнено 1 1 Стрибайте далеко.
BRANCHJ off 1 1 BRANCH з довгим зміщенням.
# Regops для особливих випадків
IFMATCH off 1 2 Успішно, якщо наступні збіги.
UNLESSM вимкнено 1 2 Не вдається, якщо наступне збігається.
SUSPEND вимкнено 1 1 "Незалежний" суб-RE.
IFTHEN вимкнено 1 1 Перемикач має передувати перемикач.
GROUPP num 1 Чи відповідає група.
# Важкий робітник
EVAL evl/flags Виконати деякий код Perl.
2L
# Модифікатори
MINMOD ні Оператор Next не жадібний.
ЛОГІЧНО ні. Наступний код операції має встановити лише прапор.
# Це ще не використовується
RENUM викл. 1 1 Група з незалежно пронумерованими дужками.
# Пов'язано спробувати
# Поведіться так само, як і A|LIST|OF|WORDS. Варіанти "..C".
# має вбудовані дані charclass (тільки ascii), 'C' зберігає їх у файлі
# структура.
СПРОБУЙТЕ спробуйте 1. Відповідати багатьом ТОЧНО(F[ALU]?)? якось.
прапори==тип
TRIEC trie Те саме, що TRIE, але з вбудованим charclass
дані charclass
AHOCORASICK trie 1 Aho Corasick stclass. прапори==тип
AHOCORASICKC спробуйте Те саме, що і AHOCORASICK, але з вбудованим
charclass дані charclass
# Підпрограми регулярного виразу
GOSUB num/ofs 2L рекурсує до парень arg1 на (підписаний) ofs arg2
GOSTART без повернення до початку шаблону
# Особливі умови
NGROUPP no-sv 1 Чи відповідає група.
INSUBP num 1 Чи знаходимося ми в певному рекурсі.
DEFINEP немає 1 Ніколи не виконуйте напряму.
# Зворотні дієслова
ENDLIKE none Використовується лише для поля типу дієслів
OPFAIL немає Те саме, що (?!)
ACCEPT parno 1 Приймає поточний відповідний рядок.
# Дієслова з аргументами
ДІЄСЛОВО no-sv 1 Використовується лише для поля типу дієслів
PRUNE no-sv 1 Шаблон не вдається в цій початковій точці, якщо ні-
повертаючись через це
MARKPOINT no-sv 1 Натисніть на поточне розташування для відкату
вирізати.
SKIP no-sv 1 У разі відмови пропустити вперед (до позначки) раніше
повторна спроба
COMMIT no-sv 1 Шаблон зазнає невдачі в разі повернення назад
через це
CUTGROUP no-sv 1 У разі відмови перейдіть до наступного чергування в
група
# Контролюйте, що зберігати в $&.
ЗДЕРЖАЄ НЕ $& починається тут.
# Нові charclass, як шаблони
LNBREAK немає загального шаблону нового рядка
# СПЕЦІАЛЬНІ REGOPS
# Це насправді не вузол, а оптимізована частина "довгого"
# вузол. Щоб спростити вихід налагодження, ми позначаємо його так, ніби це вузол
ОПТИМІЗОВАНО вимкнено заповнювач для дампу.
# Спеціальний код операції з властивістю, що в скомпільованій програмі немає коду операції
# коли-небудь буде такого типу. Таким чином, його можна використовувати як значення прапора that
# іншого коду операції не було помічено. END використовується аналогічно, в цьому END
# вузол не можна оптимізувати. Отже, END має на увазі "неоптимізований" і PSEUDO
# означає "поки що не бачив нічого для оптимізації".
PSEUDO вимкнено Псевдо код операції для внутрішнього використання.
Після інформації оптимізатора є дамп таблиці зміщення/довжини, тут розділена
через кілька рядків:
Зміщення: [45]
1[4] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 5[1]
0[0] 12[1] 0[0] 6[1] 0[0] 7[1] 0[0] 9[1] 8[1] 0[0] 10[1] 0[0]
11[1] 0[0] 12[0] 12[0] 13[1] 0[0] 14[4] 0[0] 0[0] 0[0] 0[0]
0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 18[1] 0[0] 19[1] 20[0]
Перший рядок вказує, що таблиця зміщення/довжини містить 45 записів. Кожен
запис є парою цілих чисел, позначених "зміщення [довжина]". Записи нумеруються, починаючи
з 1, тому запис №1 тут — «1[4]», а запис №12 — «5[1]». "1[4]" вказує, що
вузол з позначкою "1:" ("1: ANYOF[bc]") починається з позиції символу 1 у попередньо скомпільованому
форму регулярного виразу і має довжину 4 символи. «5[1]» у позиції 12 вказує на це
вузол з позначкою "12:" ("12: EXACT ") починається з позиції символу 5 у попередньому
скомпільована форма регулярного виразу і має довжину 1 символ. «12[1]» у позиції 14
вказує, що вузол з міткою "14:" ("14: CURLYX[0] {1,32767}") починається з символу
позиція 12 у попередньо скомпільованій формі регулярного виразу та має довжину 1 символ --- що
є, він відповідає символу "+" у попередньо скомпільованому регулярному виразі.
Елементи "0[0]" вказують на відсутність відповідного вузла.
Час виконання Вихід
Перш за все, під час виконання збігу можна не отримати результат під час виконання, навіть якщо налагодження є
увімкнено. Це означає, що механізм регулярних виразів ніколи не був введений і що вся робота була виконана
тому робиться оптимізатором.
Якщо введено механізм регулярних виразів, результат може виглядати так:
Збіг "[bc]d(ef*g)+h[ij]k$" з "abcdefg__gh__"
Встановлення області EVAL, savestack=3
2 | 1: БУДЬ-ЯКИЙ
3 | 11: ТОЧНО
4 | 13: CURLYX {1,32767}
4 | 26: ПОКИМ
0 з 1..32767 cc=effff31c
4 | 15: ВІДКРИТИ1
4 | 17: ТОЧНО
5 | 19: ЗІРКА
ТОЧНО може збігатися 1 раз з 32767...
Встановлення області EVAL, savestack=3
6 | 22: ТОЧНО
7 <__gh__> | 24: ЗАКРІТЬ1
7 <__gh__> | 26: ПОКИМ
1 з 1..32767 cc=effff31c
Встановлення області EVAL, savestack=12
7 <__gh__> | 15: ВІДКРИТИ1
7 <__gh__> | 17: ТОЧНО
відновлення \1 до 4(4)..7
не вдалося, спробуйте продовження...
7 <__gh__> | 27: НІЧОГО
7 <__gh__> | 28: ТОЧНО
не вдалося...
не вдалося...
Найважливіша інформація у виході міститься про конкретне вузол в
скомпільований регулярний вираз, який зараз тестується щодо цільового рядка. Формат
ці рядки є
""STRING-OFFSET <ПЕРЕД STRING>ПІСЛЯ STRING> |ID: TYPE
Команда TYPE інформація має відступ щодо рівня зворотного відстеження. Інші випадкові
інформація здається вкрапленою всередині.
Налагодження Perl пам'ять Використання
Perl — марнотратний марнотратник, коли справа доходить до використання пам’яті. Є приказка, що до
оцінити використання пам'яті Perl, припустити розумний алгоритм розподілу пам'яті,
помножте цю оцінку на 10, і, хоча ви все ще можете промахнутися, принаймні, не будете
дуже здивований. Це не зовсім вірно, але може добре зрозуміти, що саме
трапляється.
Припустимо, що ціле число не може займати менше 20 байт пам’яті, а число з плаваючою чисельністю не може займати менше
більше 24 байт, рядок не може займати менше 32 байт (всі ці приклади передбачають 32-бітовий
архітектури, результат трохи гірший на 64-розрядних архітектурах). Якщо змінна
доступ до нього здійснюється двома з трьох різних способів (для яких потрібне ціле число, число з плаваючою чисельністю або a
string), обсяг пам’яті може збільшитися ще на 20 байт. Недбалий Танос(3)
реалізація може значно збільшити ці цифри.
На протилежному кінці шкали декларація типу
sub foo;
може займати до 500 байт пам'яті, залежно від того, який випуск Perl ви використовуєте.
Анекдотичні оцінки роздутості коду від вихідного коду до компіляції припускають восьмикратне збільшення. Це
означає, що скомпільована форма розумна (звичайно коментована, з належним відступом тощо)
код займе приблизно у вісім разів більше місця в пам'яті, ніж код на диску.
Команда -DL Перемикач командного рядка застарів приблизно з Perl 5.6.0 (він був доступний лише якщо
Perl був побудований з "-DDEBUGGING"). Перемикач використовувався для відстеження пам'яті Perl
виділення та можливі витоки пам'яті. Сьогодні використовуються такі інструменти для налагодження malloc, як
Purify or валгринд замість цього пропонується. Дивіться також "PERL_MEM_LOG" у perlhacktips.
Один із способів дізнатися, скільки пам’яті використовується структурами даних Perl, — це встановити
модуль Devel::Size від CPAN: він дає вам мінімальну кількість байтів, необхідну для
зберігати певну структуру даних. Будь ласка, зверніть увагу на різницю між розмір ()
та total_size().
Якщо Perl був скомпільований за допомогою malloc Perl, ви можете проаналізувати використання пам'яті Perl, налаштувавши
$ENV{PERL_DEBUG_MSTATS}.
використання $ENV{PERL_DEBUG_MSTATS}
Якщо ваш perl використовує Perl malloc () і був скомпільований з необхідними перемикачами (це
за замовчуванням), тоді він друкуватиме статистику використання пам’яті після компіляції вашого коду, коли
"$ENV{PERL_DEBUG_MSTATS} > 1", і перед завершенням програми, коли
"$ENV{PERL_DEBUG_MSTATS} >= 1". Формат звіту подібний до наступного прикладу:
$ PERL_DEBUG_MSTATS=2 perl -e "потрібний Карп"
Статистика розподілу пам'яті після компіляції: (відра 4(4) ..8188(8192)
14216 безкоштовно: 130 117 28 7 9 0 2 2 1 0 0
437 61 36 0 5
60924 використано: 125 137 161 55 7 8 6 16 2 0 1
74 109 304 84 20
Всього sbrk(): 77824/21:119. Непарні кінці: колодка+голови+ланцюжок+хвіст: 0+636+0+2048.
Статистика виділення пам'яті після виконання: (відра 4(4) ..8188(8192)
30888 безкоштовно: 245 78 85 13 6 2 1 3 2 0 1
315 162 39 42 11
175816 використано: 265 176 1112 111 26 22 11 27 2 1 1
196 178 1066 798 39
Всього sbrk(): 215040/47:145. Непарні кінці: колодка+голови+ланцюжок+хвіст: 0+2192+0+6144.
Можна запитати таку статистику в довільних точках виконання за допомогою
mstat() функція поза стандартним модулем Devel::Peek.
Ось деякі пояснення цього формату:
"відра НАЙМЕНШИЙ(ПРИКБ.)..НАЙВЕЛИШИЙ(ПРИБЛИК)"
Перл malloc () використовує сегментовані виділення. Кожен запит округлюється до найближчого
доступний розмір ковша, і відро береться з пулу відер цього розміру.
Рядок вище описує ліміти відер, які зараз використовуються. Кожне відро має два
розміри: обсяг пам'яті та максимальний розмір даних користувача, який може вміститися в це
відро. Припустимо, у наведеному вище прикладі, що найменше відро було розміром 4
найбільше відро матиме корисний розмір 8188, а обсяг пам’яті буде 8192.
У Perl, створеному для налагодження, деякі сегменти можуть мати негативний корисний розмір. Це означає
що ці відра не можна (і не будуть) використовуватися. Для більших відер пам’ять
footprint може бути на одну сторінку більшим, ніж ступінь 2. Якщо так, відповідна потужність
з двох надруковано в полі "ПРИБЛИЖНО" вище.
Безкоштовно/використано
Наступні 1 або 2 рядки чисел відповідають кількості відер у кожному
розмір між "МАЛИЙ" і "ВЕЛИКИЙ". У першому ряду розміри (пам'ять
сліди) відер мають потужність у дві або, можливо, на одну сторінку більше. У другому
рядок, якщо є, сліди пам’яті сегментів знаходяться між пам’яттю
сліди двох відер «зверху».
Наприклад, припустимо, що в попередньому прикладі сліди пам'яті були
безкоштовно: 8 16 32 64 128 256 512 1024 2048 4096 8192
4 12 24 48 80
З perl без "НАЛАДЖЕННЯ" сегменти, починаючи з 128, мають 4-байтні накладні витрати, і
таким чином, сегмент довжиною 8192 може зайняти до 8188 байт.
"Усього sbrk(): SBRKed/SBRKs: CONTINUOUS"
Перші два поля вказують загальний обсяг пам'яті perl сбрк(2) ed (ess-broken? :-)
та кількість сбрк(2) використовується. Третє число — це те, що perl думає про безперервність
повернуті шматки. Поки це число додатне, malloc () буде вважати, що це так
ймовірно, що сбрк(2) забезпечить безперервну пам'ять.
Пам'ять, виділена зовнішніми бібліотеками, не враховується.
"пад: 0"
Кількість сбрк(2)пов’язана пам’ять, необхідна для вирівнювання сегментів.
"голови: 2192"
Хоча накладна пам’ять для більших відер зберігається всередині відра, для менших
відра, його зберігають на окремих ділянках. У цьому полі вказується їх загальний розмір
райони.
"ланцюжок: 0"
malloc () можливо, захочеться розділити більший відро на менші відро. Якби тільки частина
померлого відра залишається нерозділеним, решта зберігається як елемент a
зв'язаний список. Це поле показує загальний розмір цих фрагментів.
"хвіст: 6144"
Щоб мінімізувати кількість сбрк(2) с, malloc () просить більше пам'яті. Це поле дає
розмір ще невикористаної частини, яка є сбрк(2) видав, але ніколи не торкався.
Використовуйте perldebguts онлайн за допомогою служб onworks.net