АнглийскийФранцузскийИспанский

Значок OnWorks

perldebguts - Интернет в облаке

Запускайте perldebguts в бесплатном хостинг-провайдере OnWorks через Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS

Это команда perldebguts, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

ПРОГРАММА:

ИМЯ


perldebguts - внутренности отладки Perl

ОПИСАНИЕ


Это не perldebug, который рассказывает вам, как использовать отладчик. Эта страница руководства описывает
низкоуровневые детали, касающиеся внутреннего устройства отладчика, которые варьируются от сложных до
Невозможно понять для тех, кто не слишком близок к Perl.
Будьте внимательны, лектор.

Отладчик Внутренности


Perl имеет специальные отладочные крючки во время компиляции и выполнения, используемые для создания отладки.
среды. Эти крючки не следует путать с Perl -Дххх команда, описанная в
perlrun, который можно использовать только в том случае, если специальный Perl построен в соответствии с инструкциями в
УСТАНОВИТЬ podpage в дереве исходных текстов Perl.

Например, всякий раз, когда вы вызываете встроенную функцию «вызывающего абонента» Perl из пакета «DB»,
аргументы, с которыми был вызван соответствующий кадр стека, копируются в
@DB :: args массив. Эти механизмы включаются путем вызова 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)".

· После компиляции каждого файла "require" d, но перед его выполнением,
"DB :: отложено (* {" _ <$ filename "})" вызывается, если существует подпрограмма "DB :: отложено".
Здесь $ filename - это расширенное имя файла "require" d, которое можно найти в
значения% INC.

· После компиляции каждой подпрограммы "subname" существование $ DB :: отложено {subname}
проверено. Если этот ключ существует, вызывается "DB :: отложено (подимя)", если
Также существует подпрограмма "DB :: отложено".

· Поддерживается хэш% DB :: sub, ключи которого являются именами подпрограмм, а значения имеют
форма «имя файла: начальная строка-конечная строка». "имя файла" имеет форму "(eval 34)" для
подпрограммы, определенные внутри eval.

· Когда выполнение вашей программы достигает точки, которая может удерживать точку останова,
Подпрограмма "DB :: DB ()" вызывается, если любая из переменных $ DB :: trace, $ DB :: single или
$ DB :: signal верно. Эти переменные нельзя изменить "локально". Эта функция отключена
при выполнении внутри «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 существует.

Writing ВАШЕ Собственный Отладчик
Окружающая среда Переменные

Переменная среды «PERL5DB» может использоваться для определения отладчика. Например,
минимальный "рабочий" отладчик (на самом деле ничего не делает) состоит из одной строчки:

sub DB :: DB {}

Его легко определить так:

$ PERL5DB = "sub DB :: DB {}" perl -d ваш-скрипт

Другой краткий отладчик, немного более полезный, может быть создан только с помощью строки:

суб БД :: БД {печать ++ $ я; скаляр }

Этот отладчик печатает число, которое увеличивается для каждого обнаруженного оператора, и ожидает
чтобы вы перешли на новую строку, прежде чем перейти к следующему оператору.

На самом деле полезен следующий отладчик:

{
пакет БД;
суб БД {}
sub sub {print ++ $ i, "$ sub \ n"; & $ sub}
}

Он печатает порядковый номер каждого вызова подпрограммы и имя вызываемого
подпрограмма. Обратите внимание, что & DB :: sub компилируется в пакет "DB" с помощью
директива package.

При запуске отладчик читает ваш rc-файл (./.perldb or ~ / .perldb под Unix), что
может установить важные параметры. (Здесь также может быть определена подпрограмма (& afterinit); это
выполняется после того, как отладчик завершит собственную инициализацию.)

После чтения файла rc отладчик считывает переменную среды PERLDB_OPTS и
использует его для установки параметров отладчика. Содержимое этой переменной обрабатывается так, как если бы оно было
аргумент команды отладчика «o ...» (qv в «Настраиваемые параметры» в perldebug).

Отладчик внутренний Переменные

Помимо переменных, связанных с файлами и подпрограммами, упомянутыми выше, отладчик
также поддерживает различные магические внутренние переменные.

· @DB :: dbline - это псевдоним для "@ {" :: _
выбранный в данный момент файл (скомпилированный Perl), либо явно выбранный с помощью
команда отладчика "f" или неявно потоком выполнения.

Значения в этом массиве волшебны в числовом контексте: они сравниваются равными только нулю.
если леска не разламывается.

·% DB :: dbline - это псевдоним для "% {" :: _
действия, вводимые по номеру строки в текущем выбранном файле, либо явно выбранные
с помощью команды «f» отладчика или неявно путем выполнения.

Как отмечалось ранее, можно настроить отдельные записи (в отличие от всего хеша).
Perl здесь заботится только о логическом значении true, хотя значения, используемые perl5db.pl встали на сторону
форма "$ break_condition \ 0 $ action".

Отладчик Настройка функции

Некоторые функции предназначены для упрощения настройки.

· См. «Настраиваемые параметры» в perldebug для описания параметров, анализируемых
"DB :: parse_options (строка)".

· «DB :: dump_trace (skip [, count])» пропускает указанное количество кадров и возвращает список
содержащие информацию о вызывающих кадрах (все, если «count» отсутствует).
Каждая запись является ссылкой на хэш с ключами «context» (либо «.», «$» Или «@»), «sub»
(имя подпрограммы или информация о "eval"), "args" ("undef" или ссылка на массив),
"файл" и "строка".

· "DB :: print_trace (FH, skip [, count [, short]]]" выводит отформатированную информацию о вызывающем абоненте
кадры. Последние две функции могут быть удобны в качестве аргументов для команд «<», «<<».

Обратите внимание, что любые переменные и функции, которые не задокументированы на этих страницах руководства (или в
perldebug) рассматриваются только для внутреннего использования и могут быть изменены без
заметит.

Корзина Список Результат Примеры


Опция «кадр» может использоваться для управления выводом информации о кадре. Например,
сравните этот след выражения:

$ perl-de 42
Дамп стека во время штампа включен вне evals.

Загрузка подпрограмм БД из патча perl5db.pl уровня 0.94
Доступна поддержка Emacs.

Чтобы получить помощь, введите h или hh.

main :: (- e: 1): 0
DB <1> sub foo {14}

DB <2> дополнительная панель {3}

DB <3> t print foo () * bar ()
main :: ((eval 172): 3): print foo () + bar ();
main :: foo ((eval 168): 2):
main :: bar ((eval 170): 2):
42

с этим, как только "o" ption "frame = 2" был установлен:

БД <4> из = 2
frame = '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
вход в Экспортер :: экспорт
вход в 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 :: экспорт
вышел из 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 () из библиотеки / Config.pm: 0
Пакет lib / Config.pm.
в $ = Config :: TIEHASH ('Config') из lib / Config.pm: 644
out $ = Config :: TIEHASH ('Config') из библиотеки / 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 () из библиотеки / Config.pm: 0
Пакет lib / Config.pm.
в $ = Config :: TIEHASH ('Config') из lib / Config.pm: 644
out $ = Config :: TIEHASH ('Config') из библиотеки / 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 =HASH / ХЭШ(0x1aa444) ',' package ') из библиотеки / Config.pm: 574
out $ = Config :: FETCH ('Config =HASH / ХЭШ(0x1aa444) ',' package ') из библиотеки / Config.pm: 574
в $ = Config :: FETCH ('Config =HASH / ХЭШ(0x1aa444) ',' baserev ') из библиотеки / Config.pm: 574
out $ = Config :: FETCH ('Config =HASH / ХЭШ(0x1aa444) ',' baserev ') из библиотеки / Config.pm: 574

6.
в $ =КОД(0x15eca4) () из / dev / null: 0
в $ =КОД(0x182528) () из библиотеки / Config.pm: 2
Пакет lib / Exporter.pm.
из $ =КОД(0x182528) () из библиотеки / Config.pm: 0
возврат скалярного контекста из КОД(0x182528): неопределенный
Пакет lib / Config.pm.
в $ = Config :: TIEHASH ('Config') из lib / Config.pm: 628
out $ = Config :: TIEHASH ('Config') из библиотеки / 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.

печатается с правильным отступом.

Отладка Стандарт Expressions


Есть два способа включить отладочный вывод для регулярных выражений.

Если ваш perl скомпилирован с помощью "-DDEBUGGING", вы можете использовать -Доктор флаг в командной строке.

В противном случае можно «использовать повторную отладку», которая действует во время компиляции и выполнения.
Начиная с Perl 5.9.5, эта прагма имеет лексическую область видимости.

Compile времени Результат
Вывод отладки во время компиляции выглядит следующим образом:

Компиляция REx '[bc] d (ef * g) + h [ij] k $'
размер 45 Получено 364 байта для аннотаций смещения.
сначала в 1
самый редкий символ в 0
редчайший символ в 0
1: ЛЮБОЙ [bc] (12)
12: ТОЧНЫЙ (14)
14: CURLYX [0] {1,32767} (28)
16: ОТКРЫТЬ1(18)
18: ТОЧНЫЙ (20)
20: STAR(23)
21: ТОЧНЫЙ (0)
23: ТОЧНЫЙ (25)
25: ЗАКРЫТЬ1(27)
27: WHILEM [1/1] (0)
28: НИЧЕГО(29)
29: ТОЧНЫЙ (31)
31: ЛЮБОЙ [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+ "size" * 8. В следующей строке отображается метка
id первого узла, который соответствует.

Команда

привязан 'de' к 1 плавающему 'gh' на 3..2147483647 (проверка плавающего)
stclass 'ANYOF [bc]' minlen 7

Строка (разделенная на две строки выше) содержит информацию оптимизатора. В показанном примере
оптимизатор обнаружил, что совпадение должно содержать подстроку «de» со смещением 1 плюс
подстрока «gh» с некоторым смещением от 3 до бесконечности. Более того, при проверке этих
подстроки (чтобы быстро отказаться от невозможных совпадений), Perl проверит наличие подстроки "gh"
перед проверкой наличия подстроки «de». Оптимизатор также может использовать информацию о том, что
матч начинается (в «первом» id) с классом символов, а строка не короче 7
символы могут совпадать.

Поля интереса, которые могут появиться в этой строке:

"на якоре" STRING "в" POS
"плавающий" STRING "в" ПОС1..ПОЛ2
См. Выше.

"соответствующий плавающий / якорь"
Какую подстроку проверять в первую очередь.

"минлен"
Минимальная длина матча.

"stclass" ТИП
Тип первого совпадающего узла.

«носкан»
Не ищите найденные подстроки.

"это все"
Означает, что информация оптимизатора - это все, что содержит регулярное выражение, и
таким образом, совсем не нужно входить в механизм регулярных выражений.

"GPOS"
Устанавливается, если шаблон содержит "\ G".

«Больше»
Устанавливается, если шаблон начинается с повторяющегося символа (как в «x + y»).

"скрытый"
Установите, если шаблон начинается с ". *".

"с eval"
Устанавливается, если шаблон содержит eval-группы, такие как "(? {Code})" и "(?? {code})".

"закрепленный (ТИП)"
Если шаблон может совпадать только в нескольких местах, где "TYPE" является "SBOL",
«MBOL» или «GPOS». См. Таблицу ниже.

Если известно, что подстрока соответствует только в конце строки, за ней может следовать "$", как в
"плавающий 'k' $".

Информация, относящаяся к оптимизатору, используется, чтобы избежать ввода (медленного) механизма регулярных выражений на
строки, которые точно не будут совпадать. Если установлен флаг "isall", вызов регулярного выражения
Engine можно избежать, даже если оптимизатор нашел подходящее место для совпадения.

Над разделом оптимизатора находится список узлы скомпилированной формы регулярного выражения. Каждый
строка имеет формат

""id: ТИП ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ (следующий идентификатор)

Тип of Nodes
Вот текущие возможные типы с кратким описанием:

# TYPE arg-description [num-args] [longjump-len] ОПИСАНИЕ

# Точки выхода

КОНЕЦ нет Конец программы.
УСПЕХ нет возврата из подпрограммы, в основном.

# Якоря начала линии:
SBOL не соответствует "" в начале строки: / ^ /, / \ A /
MBOL нет То же самое, при условии, что многострочный: / ^ / m

# Концевые анкеры линии:
SEOL не соответствует "" в конце строки: / $ /
MEOL нет То же самое, предполагая, что многострочный: / $ / м
EOS не соответствует "" в конце строки: / \ z /

# Сопоставить начало привязки:
GPOS нет Совпадает с окончанием последнего m // g.

# Коды операций границы слов:
BOUND no Как BOUNDA для не-utf8, в противном случае соответствует ""
между любым Unicode \ w \ W или \ W \ w
BOUNDL нет Как BOUND / BOUNDU, но \ w и \ W определены
по текущему языку
BOUNDU no Match "" на любой границе данного типа
с использованием правил 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 no Match "" на любой границе данного типа
с использованием правил Unicode
NBOUNDA no Match "" между любыми \ w \ w или \ W \ W, где \ w
это [_a-zA-Z0-9]

# [Особые] альтернативы:
REG_ANY нет Соответствует любому символу (кроме новой строки).
SANY нет Соответствует одному символу.
CANY нет Соответствует любому байту.
ANYOF sv 1 Соответствует символу в этом классе (или не в нем),
только совпадение с одним символом
ANYOFL sv 1 Как ANYOF, но действует / l

# Классы символов POSIX:
POSIXD нет Некоторые [[: class:]] под / d; поле ФЛАГИ
дает какой
POSIXL нет Некоторые [[: class:]] в / l; поле ФЛАГИ
дает какой
POSIXU нет Некоторые [[: class:]] под / u; поле ФЛАГИ
дает какой
POSIXA нет Некоторые [[: class:]] под / a; поле ФЛАГИ
дает какой
NPOSIXD не является дополнением к POSIXD, [[: ^ class:]]
NPOSIXL не является дополнением к POSIXL, [[: ^ class:]]
NPOSIXU не является дополнением к POSIXU, [[: ^ class:]]
NPOSIXA не является дополнением к POSIXA, [[: ^ class:]]

CLUMP нет Соответствует любой расширенной последовательности кластера графем

# Чередование

# ВЕТКА Набор ветвей, составляющих единичный выбор:
# соединены вместе со своими указателями "next", поскольку
# приоритет предотвращает присоединение чего-либо к
# любая отдельная ветка. "Следующий" указатель последнего
# ФИЛИАЛ в выборе указывает на то, что следует за
# весь выбор. Здесь же находится финальный «следующий»
# указатель каждой отдельной точки ветвления; каждая ветка
# начинается с узла операнда узла 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).

# Ничего не делать типы

НИЧЕГО нет Соответствует пустой строке.
# Вариант выше, который разграничивает группу, что останавливает оптимизацию
ХВОСТ нет Соответствует пустой строке. Можно прыгнуть сюда из
за пределами.

# Петли

# ЗВЕЗДА, ПЛЮС '?' И сложные '*' и '+' реализованы как
# круговые ВЕТВИЛЬНЫЕ конструкции. Простые случаи
# (один символ на совпадение) реализованы с помощью STAR
# и PLUS для скорости и минимизации рекурсивных погружений.
#
Узел ЗВЕЗДА Сопоставьте эту (простую) вещь 0 или более раз.
Узел PLUS Сопоставьте эту (простую) вещь 1 или более раз.

CURLY sv 2 Сопоставьте эту простую вещь {n, m} раз.
CURLYN no 2 Захват следующего после этой простой вещи
CURLYM № 2 Запечатлейте эту вещь средней сложности {n, m}
раз.
CURLYX sv 2 Сопоставьте эту сложную вещь {n, m} раз.

# Этот терминатор создает структуру цикла для CURLYX
WHILEM no Выполните фигурную обработку и посмотрите, совпадают ли остальные.

# Связано с буфером

# OPEN, CLOSE, GROUPP ... нумеруются во время компиляции.
OPEN num 1 Отметить эту точку ввода как начало #n.
ЗАКРЫТЬ num 1 Аналогично ОТКРЫТЬ.

REF num 1 Соответствует некоторой уже совпавшей строке
REFF num 1 Сопоставить уже совпавшую строку, сложенную с помощью
собственные правила кодировки для не-utf8
REFFL num 1 Соответствует уже совпавшей строке, свернутой в лок.
REFFU num 1 Сопоставить уже совпавшую строку, сложенную с использованием
правила юникода для не-utf8
REFFA num 1 Соответствует уже подобранной строке, сложенной с использованием
правила Юникода для не-utf8, без смешивания ASCII,
не-ASCII

# Именованные ссылки. Код в regcomp.c предполагает, что все это после
# пронумерованные ссылки
NREF no-sv 1 Соответствует некоторой уже совпавшей строке
NREFF no-sv 1 Сопоставить уже совпавшую строку, сложенную с помощью
собственные правила кодировки для не-utf8
NREFFL no-sv 1 Соответствует уже совпавшей строке, свернутой в лок.
NREFFU num 1 Сопоставить уже совпавшую строку, сложенную с использованием
правила юникода для не-utf8
NREFFA num 1 Сопоставить уже совпавшую строку, сложенную с помощью
правила Юникода для не-utf8, без смешивания ASCII,
не-ASCII

# Поддержка длинного RE
LONGJMP off 1 1 Прыгнуть далеко.
BRANCHJ выкл. 1 1 BRANCH с длинным смещением.

# Особый случай Regops
IFMATCH off 1 2 Успешно, если следующие совпадения.
UNLESSM off 1 2 Не удается, если следующие совпадения.
ПРИОСТАНОВИТЬ выключен 1 1 «Независимый» суб-RE.
ЕСЛИ ВЫКЛ. 1 1 Переключатель, должен стоять перед переключателем.
GROUPP num 1 Соответствует ли группа.

# Тяжелый рабочий

EVAL evl / flags Выполнить некоторый код Perl.
2L

# Модификаторы

MINMOD no Оператор Next не жадный.
ЛОГИЧЕСКИЙ нет Код операции Next должен устанавливать только флаг.

# Это еще не используется
RENUM off 1 1 Группа с независимо пронумерованными паренами.

# Пробовать связанные

# Вести себя так же, как A | LIST | OF | WORDS. Варианты "..C"
# иметь встроенные данные charclass (только ascii), 'C' хранит их в
# состав.

TRIE trie 1 Совпадение многих ТОЧНЫХ (F [ALU]?)? однажды.
флаги == тип
TRIEC trie То же, что TRIE, но со встроенным классом символов
данные charclass

AHOCORASICK trie 1 Aho Corasick stclass. флаги == тип
AHOCORASICKC trie То же, что и AHOCORASICK, но со встроенным
charclass данные charclass

# Подпрограммы Regex
GOSUB num / ofs 2L рекурсивно объединяет arg1 в (подписанный) ofs arg2
ГОСТАРТ без рекурсии к началу шаблона

# Специальные условия
NGROUPP no-sv 1 Соответствует ли группа.
INSUBP num 1 Находимся ли мы в определенной рекурсии.
DEFINEP none 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 При неудаче перейти к следующему чередованию в
группы

# Контролировать, что хранить в $ &.
KEEPS no $ & начинается здесь.

# Новые шаблоны типа charclass
LNBREAK нет универсального шаблона новой строки

# СПЕЦИАЛЬНЫЕ РЕГОПЛАТЫ

# На самом деле это не узел, а оптимизированная часть "длинного"
# узел. Чтобы упростить вывод отладки, мы помечаем его, как если бы это был узел
ОПТИМИЗАЦИЯ с заполнителя для дампа.

# Специальный код операции со свойством, что код операции в скомпилированной программе отсутствует
# когда-либо будет такого типа. Таким образом, его можно использовать как значение флага, которое
# другого кода операции не было. END используется аналогично в том смысле, что END
# узел не может быть оптимизирован. Итак, END подразумевает "неоптимизируемый" и PSEUDO
# означает "еще не видел ничего для оптимизации".
PSEUDO off Псевдо-код операции для внутреннего использования.

После информации оптимизатора следует дамп таблицы смещения / длины, здесь разделен
в несколько строк:

Смещения: [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: ТОЧНЫЙ
не смогли...
не смогли...

Наиболее важная информация в выводе касается конкретного узел
скомпилированное регулярное выражение, которое в настоящее время проверяется на целевой строке. Формат
эти строки

""СТРОКА-СМЕЩЕНИЕ <ПРЕДВАРИТЕЛЬНАЯ СТРУКТУРА>ПОСЛЕ-СТРОКА> |ID: ТИП

Команда ТИП информация имеет отступ относительно уровня возврата. Другое случайное
информация появляется вкраплениями внутри.

Отладка Perl Память Применение


Когда дело доходит до использования памяти, Perl - расточитель. Есть поговорка, что
оценить использование памяти Perl, предположить разумный алгоритм распределения памяти,
умножьте эту оценку на 10, и хотя вы все еще можете промахнуться, по крайней мере, вы не будете
совсем так удивлен. Это не совсем так, но может дать хорошее представление о том, что
случается.

Предположим, что целое число не может занимать меньше 20 байт памяти, а число с плавающей запятой не может занимать меньше
чем 24 байта, строка не может занимать менее 32 байтов (все эти примеры предполагают 32-битное
архитектуры, на 64-битных архитектурах результат несколько хуже). Если переменная
доступен двумя из трех разных способов (для которых требуется целое число, число с плавающей запятой или
string) объем памяти может увеличиться еще на 20 байт. Небрежный таНос(3)
реализация может резко завышать эти цифры.

На противоположном конце шкалы объявление типа

суб фу;

может занимать до 500 байт памяти, в зависимости от того, какой выпуск Perl вы используете.

По неофициальным данным, раздувание кода между исходными кодами и компиляцией предполагает восьмикратное увеличение. Этот
означает, что скомпилированная форма разумного (обычно с комментариями, с правильным отступом и т. д.)
код займет примерно в восемь раз больше места в памяти, чем код на диске.

Команда -DL переключатель командной строки устарел, начиная с Perl 5.6.0 (он был доступен, только если
Perl был построен с помощью "-DDEBUGGING"). Переключатель использовался для отслеживания памяти Perl
выделения и возможные утечки памяти. В наши дни использование инструментов отладки malloc, таких как
очищаться or Valgrind предлагается вместо этого. См. Также «PERL_MEM_LOG» в perlhacktips.

Один из способов узнать, сколько памяти используется структурами данных Perl, - это установить
модуль Devel :: Size из CPAN: он дает минимальное количество байтов, необходимых для
хранить определенную структуру данных. Обратите внимание на разницу между размер()
и общий размер().

Если Perl был скомпилирован с использованием Perl malloc, вы можете проанализировать использование памяти Perl, установив
$ ENV {PERL_DEBUG_MSTATS}.

. $ ENV {PERL_DEBUG_MSTATS}
Если ваш Perl использует Perl таНос () и был скомпилирован с необходимыми переключателями (это
по умолчанию), то он будет печатать статистику использования памяти после компиляции вашего кода, когда
"$ ENV {PERL_DEBUG_MSTATS}> 1" и перед завершением программы, когда
"$ ENV {PERL_DEBUG_MSTATS}> = 1". Формат отчета аналогичен следующему примеру:

$ PERL_DEBUG_MSTATS = 2 perl -e "требует карпа"
Статистика распределения памяти после компиляции: (buckets 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
74 109 304 84 20
Итого sbrk (): 77824/21: 119. Нечетные концы: подушечка + головки + цепочка + хвост: 0 + 636 + 0 + 2048.
Статистика выделения памяти после выполнения: (buckets 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
196 178 1066 798 39
Итого sbrk (): 215040/47: 145. Нечетные концы: подушечка + головки + цепочка + хвост: 0 + 2192 + 0 + 6144.

Можно запросить такую ​​статистику в произвольных точках выполнения, используя
mstat () функция вне стандартного модуля Devel :: Peek.

Вот некоторые объяснения этого формата:

"ведра САМЫЕ МАЛЕНЬКИЕ (ПРИБЛИЗИТЕЛЬНО) .. САМЫЕ БОЛЬШИЕ (ПРИБЛИЗИТЕЛЬНО)"
в Perl таНос () использует распределения с интервалами. Каждый запрос округляется до ближайшего
размер ведра доступен, и ведро берется из пула ведер этого размера.

Строка выше описывает пределы используемых в настоящее время сегментов. В каждом ведре по два
размеры: объем памяти и максимальный размер пользовательских данных, которые могут уместиться в этом
ведро. Предположим, что в приведенном выше примере самое маленькое ведро было размером 4.
самая большая корзина будет иметь полезный размер 8188, а объем памяти - 8192.

В Perl, созданном для отладки, некоторые корзины могут иметь отрицательный полезный размер. Это означает
что эти ведра не могут (и не будут) использоваться. Для больших ведер память
размер может быть на одну страницу больше, чем степень 2. Если это так, соответствующая мощность
из двух напечатано в поле «ПРИБЛИЗИТЕЛЬНО» выше.

Бесплатно / Используется
Следующие 1 или 2 строки чисел соответствуют количеству ведер в каждом
размер от "САМЫЙ" до "САМЫЙ". В первой строке размеры (память
следы) ведер имеют степень двойки или, возможно, на одну страницу больше. Во-вторых
row, если присутствует, следы памяти ведер находятся между памятью
следы двух ведер «наверху».

Например, предположим, что в предыдущем примере следы памяти были

бесплатно: 8 16 32 64 128 256 512 1024 2048 4096 8192
4 12 24 48 80

При использовании perl без «ОТЛАДКИ» сегменты, начинающиеся со 128, имеют 4-байтовые накладные расходы, а
таким образом, сегмент длиной 8192 байта может занимать до 8188 байтов.

"Всего sbrk (): SBRKed / SBRK: НЕПРЕРЫВНО"
Первые два поля дают общий объем памяти perl. сбрк(2) ed (ess-broken? :-)
и количество сбрк(2) s используется. Третье число - это то, что Perl думает о непрерывности
вернул куски. Пока это число положительное, таНос () Предположим, что это
вероятно, что сбрк(2) обеспечит непрерывную память.

Память, выделенная внешними библиотеками, не учитывается.

"pad: 0"
Количество сбрк(2) объем памяти, необходимый для выравнивания сегментов.

"голов: 2192"
Хотя накладные расходы на память для больших сегментов сохраняются внутри сегмента, для меньших
ведра, хранится на отдельных участках. В этом поле указан общий размер этих
области.

"цепочка: 0"
таНос () может захотеть разделить ведро большего размера на ведра меньшего размера. Если бы только часть
ведра умершего оставляется неразделенным, остальное хранится как элемент
связанный список. В этом поле указан общий размер этих фрагментов.

"хвост: 6144"
Чтобы свести к минимуму количество сбрк(2) с, таНос () просит больше памяти. Это поле дает
размер еще неиспользованной части, которая сбрк(2) изд, но ни разу не трогал.

Используйте perldebguts онлайн с помощью сервисов onworks.net


Бесплатные серверы и рабочие станции

Скачать приложения для Windows и Linux

  • 1
    UnitedRPMS
    UnitedRPMS
    Присоединяйтесь к нам в Gitter!
    https://gitter.im/unitedrpms-people/Lobby
    Включите репозиторий URPMS в вашем
    система -
    https://github.com/UnitedRPMs/unitedrpms.github.io/bl...
    Скачать объединенные рпмс
  • 2
    Boost C ++ библиотеки
    Boost C ++ библиотеки
    Boost предоставляет бесплатное портативное
    рецензируемые библиотеки C++.
    упор делается на портативные библиотеки, которые
    хорошо работать со стандартной библиотекой C++.
    Смотрите http://www.bo...
    Скачать библиотеки Boost C++
  • 3
    Виртуальный GL
    Виртуальный GL
    VirtualGL перенаправляет 3D-команды из
    Приложение Unix / Linux OpenGL на
    серверный GPU и преобразует
    визуализированные 3D-изображения в видеопоток
    с которым ...
    Скачать VirtualGL
  • 4
    libusb
    libusb
    Библиотека для включения пользовательского пространства
    прикладные программы для связи с
    USB-устройства. Аудитория: Разработчики, Конец
    Пользователи/рабочий стол. Язык программирования: С.
    Категории ...
    Скачать libusb
  • 5
    Сковорода
    Сковорода
    SWIG - это инструмент для разработки программного обеспечения
    который соединяет программы, написанные на C, и
    C ++ с множеством высокоуровневых
    языки программирования. SWIG используется с
    разные...
    Скачать SWIG
  • 6
    Тема WooCommerce Nextjs React
    Тема WooCommerce Nextjs React
    Тема React WooCommerce, созданная с помощью
    Далее JS, Webpack, Babel, Node и
    Экспресс, используя GraphQL и Apollo
    Клиент. Магазин WooCommerce в React (
    содержит: продукты...
    Скачать тему WooCommerce Nextjs React
  • Больше »

Команды Linux

Ad