Как я могу заменить использование модуля perl вызовом внешней программы?

Вот с чего я начинаю

#$Id: MultiMarkdown.pm 4103 2009-03-02 20:41:50Z andrew $

package Template::Plugin::MultiMarkdown;

use strict;
use base qw (Template::Plugin::Filter);

use Text::MultiMarkdown;

our $VERSION = 0.03;

sub init {
    my $self = shift;
    $self->{_DYNAMIC} = 1;
    $self->install_filter($self->{_ARGS}->[0] || 'multimarkdown');
    return $self;
}

sub filter {
    my ($self, $text, $args, $config) = @_;
    my $m = Text::MultiMarkdown->new(%{$config || {}});
    return $m->markdown($text);
}

1;

Я хочу изменить ссылку на Perl moudule Text::MultiMarkdown использовать исполняемый файл /usr/local/bin/multimarkdown

Я думаю, что мне нужно изменить:

use Text::MultiMarkdown; 

к

use IPC::run3

а затем my $m линия включает в себя вызов run3, но тогда я потерялся.

Я нашел несколько упоминаний о том, как написать фильтр как в списке рассылки Template Toolkit, так и в Perl Monks, но в обоих случаях ответ предполагает, что я знаю то, чего не знаю, и это происходит прямо у меня над головой, поэтому запрос здесь.

Я задавал подобный вопрос ранее, но данный ответ, похоже, не относится к использованию внешней программы.

2 ответа

Вот простой пример фильтра, который вызывает внешнюю программу (perl) заменить все вхождения "Hello" на "Bye". Оно использует IPC::Run3:

package Template::Plugin::MultiMarkdown;
use strict;
use base qw (Template::Plugin::Filter);

use IPC::Run3;
our $VERSION = 0.03;

sub init {
    my $self = shift;
    $self->{_DYNAMIC} = 1;
    $self->install_filter($self->{_ARGS}->[0] || 'multimarkdown');
    return $self;
}

sub filter {
    my ($self, $text, $args, $config) = @_;
    my $out;
    run3 ['perl', '-pE', 's/Hello/Bye/g'], \$text, \$out; 
    return $out;
}

Ваши идеи и дизайн не верны. Вы не должны расширять сферу действия любого подкласса за пределы его родителя. Перегрузка метода для использования системного вызова ужасна.

Другие вопросы по тегам