Codebits
that rock!

Aug 01, 2012

Пример работы модуля Deparse для perl

posted by varnie • Tags: perlShow comments

На простом примере разобрался как работать с модулем Deparse для изучения более детально синтаксического вида разобранной программы, как видит её perl.

Итак, имеем кривую программку:

#!/usr/bin/perl    
use Modern::Perl;

my $i = 1;
while ($i & 8 == 0 || $i & 256 == 0){
    ++$i;
}
print $i, "\n";

, которая на выводе даёт единицу. Если проблема слёту не видна, обратимся к возможностям модуля Deparse:

varnie@foo:~/bar$ perl -MO=Deparse /home/varnie/buggy.pl

use Modern::Perl;
use warnings;
use strict 'refs';
BEGIN {
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
my $i = 1;
while ($i & !1 or $i & 0) {
    ++$i;
}
print $i, "\n";

/home/varnie/buggy.pl syntax OK

Здесь видно каким образом перловский парсер её видит; налицо ошибка. Правим:

#!/usr/bin/perl
use Modern::Perl;

my $i = 1;
while (!($i & 8) || !($i & 256)){
    ++$i;
}

print $i, "\n"

Запускаем - 264. Все ОК. Для интереса запускаем с модулем Deparse: varnie@foo:~/bar$ perl -MO=Deparse /home/varnie/fixed.pl

use Modern::Perl;
use warnings;
use strict 'refs';
BEGIN {
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
my $i = 1;
while (not $i & 8 or not $i & 256) {
    ++$i;
}
print $i, "\n";

/home/varnie/fixed.pl syntax OK

Видно что условие в цикле соответствует тому, что мы и пытались выполнить в перле.


blog comments powered by Disqus
Fork me on GitHub