使用Filter :: Util :: Call访问Perl中剩余的调用源代码行

时间:2011-10-24 21:07:25

标签: perl source-filter

以下是一个基本的源过滤器,只需将新行插入到use'的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源过滤机制的限制?

1 个答案:

答案 0 :(得分:1)

Filter :: Util :: Call似乎在您描述的方式上受到限制。也许这是你给出的一个过于简化的例子,但有什么理由你不能只使用字符串eval而不是源过滤器?

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