2011-10-24 11 views
3

以下は、Perlソースコードにuse 'dという新しい行を挿入するだけの基本的なソースフィルタです。Filter :: Util :: Callを使用してPerlの呼び出し側ソース行の残りの部分にアクセスする

use warnings; 
use strict; 
use 5.010; 

{package insert; 
    use Filter::Util::Call; 
    BEGIN {$INC{'insert.pm'}++} 
    sub import { 
     my ($class, @data) = @_; 
     filter_add sub { 
      my $status = filter_read; 
      if ($status) { 
       $_ = "@data;$_"; 
       filter_del; 
      } 
      $status 
     } 
    } 
} 

my $x = 'init'; 
say $x;        # init 
use insert '$x = "hello"'; say $x; # init (should be hello) 
say $x;        # hello 

問題は、端部のコメントに示すように、任意のコードが、それでも同じ行に、使用ステートメントの端子セミコロンに続くことで、挿入前にコンパイルされてしまう。その後、自身を削除しソース。

私はFilter::Util::Callを間違って使用していますか?最初の行をキャッチするようにフィルタを設定する他の方法はありますか?あるいは、これはPerlのソースフィルタリングメカニズムの制限にすぎませんか?

+0

これは必要な機能ですか、気づいたばかりですか? – Schwern

+0

両方のビット。 Filter :: Util :: Callのこの使用法は完全に安全です(perlを解析しようとするリスクはありません)が、上記の明らかな注意点があります。 –

答えて

1

Filter :: Util :: Callは、記述した方法で制限されているようです。おそらく、これはあまり単純化された例ですが、ソースフィルタの代わりに文字列evalを使用するだけの理由はありますか?

my $x = 'init'; 
say $x;        # init 
eval '$x = "hello"'; say $x;  # init (should be hello) 
say $x;        # hello 
関連する問題