Devel::Declare удаляет строку из скрипта

Я пытаюсь изучить Devel::Declare, чтобы попытаться повторно реализовать что-то вроде PDL::NiceSlice без исходных фильтров. Я куда-то шел, когда заметил, что из моего сценария удаляется следующая строка. Чтобы проиллюстрировать это, я сделал этот минимальный пример, в котором можно использовать ключевое слово comment для удаления всей строки из кода, позволяя компилировать, даже если в этой строке много пустых слов.

#Comment.pm
package Comment;

use strict;
use warnings;

use Devel::Declare ();

sub import {
  my $class = shift;
  my $caller = caller;

  Devel::Declare->setup_for(
      $caller,
      { comment => { const => \&parser } }
  );
  no strict 'refs';
  *{$caller.'::comment'} = sub {};

}

sub parser {
  #my $linestr = Devel::Declare::get_linestr;
  #print $linestr;

  Devel::Declare::set_linestr("");
}

1

а также

#!/usr/bin/env perl
#test.pl

use strict;
use warnings;

use Comment;

comment stuff;

print "Print 1\n";
print "Print 2\n";

дает только

Print 2

что мне не хватает?

P.S. У меня, вероятно, возникнет еще несколько вопросов по D::D, если я разберусь с этим, так что заранее спасибо!


person Joel Berger    schedule 08.08.2011    source источник


Ответы (1)


Итак, я понял. Используя perl -MO=Deparse test.pl, вы получаете:

use Comment;
use warnings;
use strict 'refs';
comment("Print 1\n");
print "Print 2\n";
test.pl syntax OK

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

sub parser {
  Devel::Declare::set_linestr("comment();");
}

так что deparse:

use Comment;
use warnings;
use strict 'refs';
comment();
print "Print 1\n";
print "Print 2\n";
test.pl syntax OK

и правильный вывод тоже.

person Joel Berger    schedule 09.08.2011