Использование Filter :: Util :: Call для доступа к оставшейся части исходной строки вызова в Perl - PullRequest
3 голосов
/ 25 октября 2011

Ниже приведен базовый фильтр исходного кода, который просто вставляет новую строку в исходный код Perl в точке, где он равен use 'd, а затем удаляет себя:

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

Проблема, какв конце в комментариях показано, что любой код, следующий за конечной точкой с запятой оператора use, но все еще находящийся на той же строке, в конечном итоге компилируется перед вставленным источником.

Использую ли я Filter:: Util :: Звонить неправильно?Есть ли другой способ настроить фильтр так, чтобы он ловил первую строку?Или это всего лишь ограничение механизмов фильтрации исходного кода в Perl?

1 Ответ

1 голос
/ 29 апреля 2012

Filter :: Util :: Call действительно ограничен, как вы описали. Возможно, это слишком упрощенный пример, который вы привели, но есть ли причина, по которой вы не можете просто использовать строку eval вместо исходного фильтра?

my $x = 'init';
say $x;                             # init
eval '$x = "hello"'; say $x;        # init (should be hello)
say $x;                             # hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...