5

ソースフィルターなし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

私は何が欠けていますか?

PS これを理解する必要がある場合は、おそらくさらにいくつかの質問があると思いますD::Dので、事前に感謝します!

4

1 に答える 1

4

わかりました。を使用perl -MO=Deparse test.plすると、次のようになります。

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

これは、 if が強制的にcomment関数を呼び出すことを示しています。comment()いくつかの実験の後、次のものを呼び出そうとしないように、明示的に呼び出すように出力を設定できることがわかりましたcomment

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

逆パースは次のようになります。

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

そして適切な出力も。

于 2011-08-09T00:04:02.687 に答える