3

我在 RT (http://bestpractical.com/rt) 中做一些模板编程,它使用 Perl。不幸的是,我只是偶尔玩弄 Perl。

我正在尝试调用一个以以下开头的子过程:

sub PrepareEmailUsingTemplate {
    my %args = (
        Template => '',
        Arguments => {},
        @_
    );

由于这是库的一部分,因此我无法更改它。

我给它打的电话是:

my ($template, $msg) = RT::Interface::Email->PrepareEmailUsingTemplate( 
    Template => 'CCReplyFirstMessage' );
return (0, $msg) unless $template;

我在 /opt/rt4/sbin/../lib/RT/Interface/Email.pm 第 552 行得到“散列分配中的奇数个元素”。(/opt/rt4/sbin/../lib/RT /Interface/Email.pm:552),with 是 sub 的第一行。

我知道我在传递参数时做了一些奇怪的事情。我应该如何通过它?

4

3 回答 3

11

PrepareEmailUsingTemplate不是类方法,它是一个简单的函数。你想这样称呼它:

my ($template, $msg) = RT::Interface::Email::PrepareEmailUsingTemplate( 
    Template => 'CCReplyFirstMessage' );
return (0, $msg) unless $template;

当你用 调用它时->,你@_最终会得到三个值:你的两个用于哈希和开头的类名。将其作为类方法调用的结果将是这样的:

my %args = (
    Template => '',
    Arguments => {},
    'RT::Interface::Email::PrepareEmailUsingTemplate',
    Template => 'CCReplyFirstMessage'
);

这就是您的“哈希分配中的奇数个元素”错误的来源。

于 2011-06-30T04:50:31.277 回答
8

尝试:

my ($template, $msg) = RT::Interface::Email::PrepareEmailUsingTemplate(Template => 'CCReplyFirstMessage');

该函数不是为了用->.

于 2011-06-30T04:43:57.930 回答
0

如果要将 sub 作为类方法调用,则需要额外的隐式类参数:

my $class = shift;
my %args = ( ..., @_ );
于 2011-06-30T04:57:56.793 回答