Как я могу заменить использование модуля 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;
}
Ваши идеи и дизайн не верны. Вы не должны расширять сферу действия любого подкласса за пределы его родителя. Перегрузка метода для использования системного вызова ужасна.