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のソースフィルタリングメカニズムの制限にすぎませんか?
これは必要な機能ですか、気づいたばかりですか? – Schwern
両方のビット。 Filter :: Util :: Callのこの使用法は完全に安全です(perlを解析しようとするリスクはありません)が、上記の明らかな注意点があります。 –