Deparsing/Decomposing — шаг за шагом этот запутанный perl-скрипт

As заголовок - пожалуйста, кто-нибудь может объяснить, как работают следующие скрипты

это печатает текст: "Perl, парни умные"

''=~('(?{'.('])@@^{'^'-[).*[').'"'.('-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_').',$/})')

это печатает только "b"

use strict;
use warnings;
''=~('(?{'.('_/).+{'^'/]@@_[').'"'.('=^'^'_|').',$/})')

perl -MO=Deparse показывает только это:

use warnings;
use strict 'refs';
'' =~ m[(?{print "b",$/})];

но понятия не имею, почему... ;(

Каков рекомендуемый способ декомпозиции наподобие скриптов? С чего начать?

Итак, попробовал следующее:

'' =~
(
        '(?{'
        .
        (
                '])@@^{' ^ '-[).*['
        )
        .
        '"'
        .
        (
                 '-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'
        )
        .
        ',$/})'
)

несколько частей объединяются . , И результат побитового ^, вероятно, дает текстовые части.The:

perl -e "print '-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'"

печатает "Perl ребята умные" и первый ^генерирует "печать".

Но когда я переписываю его на:

'' =~
(
    '(?{'
    .
    (
        'print'
    )
    .
    '"'
    .
    (
         'Perl guys are smart'
    )
    .
    ',$/})'
)

Мой Perl сказал мне:

panic: top_env

Странно, впервые я увидел подобное сообщение об ошибке...

Это значит: нельзя заменить 'str1' ^ 'str2'с результатом , (не понимаю почему) и почему perl печатает паническое сообщение?

мой perl:

This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-multi-2level

Ps: примеры генерируются здесь

7
задан cajwine 16 June 2012 в 22:05
поделиться