如何通过调用外部程序来替换perl模块的使用?

时间:2016-12-21 22:19:42

标签: perl filter perl-module template-toolkit

这是我从

开始的
#$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 个答案:

答案 0 :(得分:3)

这是一个过滤器的简单示例,该过滤器调用外部程序(perl)以用“Bye”替换所有出现的“Hello”。它使用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;
}

答案 1 :(得分:0)

您的想法和设计是错误的。您不能将任何子类的范围扩展到其父级之外。重载方法以使用系统调用是非常糟糕的。