Пример работы модуля Deparse для perl
На простом примере разобрался как работать с модулем 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
Видно что условие в цикле соответствует тому, что мы и пытались выполнить в перле.