Использование YAPE::Regex::Explain
(не уверен, что это хорошо, но это первый результат в поиске):
use YAPE::Regex::Explain;
my $REx = qr/(((\w)\W*(?{$^R.(0+( q{a}lt$3))})) {8}(?{print +pack"B8" ,$^Rand ""})) +/x;
my $exp = YAPE::Regex::Explain->new($REx)->explain;
print $exp;
У меня есть объяснение как:
( group and capture to \1 (1 or more times
(matching the most amount possible)):
----------------------------------------------------------------------
( group and capture to \2 (8 times):
----------------------------------------------------------------------
( group and capture to \3:
----------------------------------------------------------------------
\w word characters (a-z, A-Z, 0-9, _)
----------------------------------------------------------------------
) end of \3
----------------------------------------------------------------------
\W* non-word characters (all but a-z, A-Z,
0-9, _) (0 or more times (matching the
most amount possible))
----------------------------------------------------------------------
(?{$^R.(0+( run this block of Perl code
q{a}lt$3))})
----------------------------------------------------------------------
){8} end of \2 (NOTE: because you are using a
quantifier on this capture, only the
LAST repetition of the captured pattern
will be stored in \2)
----------------------------------------------------------------------
(?{print +pack"B8" run this block of Perl code
,$^Rand ""})
----------------------------------------------------------------------
)+ end of \1 (NOTE: because you are using a
quantifier on this capture, only the LAST
repetition of the captured pattern will be
stored in \1)
Есть 2 блока кода Perl, которые должны анализироваться независимо.
В первом блоке:
$^R . (0 + (q{a} lt $3))
здесь $^R
- это «результат оценки последнего успешного (?{ code })
утверждения регулярного выражения», а выражение (0 + (q{a} lt $3))
дает 1, если третий захват находится в [b-z]
, 0 в противном случае.
Во втором блоке:
print +pack "B8", $^R and ""
интерпретирует предыдущий результат вычисления как двоичную строку (big-endian), получает число, преобразовывает его в соответствующий символ и, наконец, выводит его на печать.
Вместе регулярное выражение находит каждые 8 буквенно-цифровых символов, а затем обрабатывает символы из [b-z]
как двоичную цифру 1, иначе 0. Эти 8 двоичных цифр затем интерпретируются как код символа, и этот символ выводится на печать.
Например, буква «H» = 0b01001000 будет напечатана при совпадении со строкой
$test = 'OvERfLOW';