获取“哈希赋值中奇数个元素”时如何传递参数

时间:2011-06-30 04:34:55

标签: perl rt

我正在RT(http://bestpractical.com/rt)中进行一些模板编程,它使用Perl。不幸的是,我偶尔只会和Perl讨价还价。

我正在尝试调用以:

开头的子过程
sub PrepareEmailUsingTemplate {
    my %args = (
        Template => '',
        Arguments => {},
        @_
    );

由于这是lib的一部分,我无法改变它。

我正在做的电话是:

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

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

我知道我在传递参数方面做得很糟糕。我该怎么做?

3 个答案:

答案 0 :(得分: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'
);

这就是你的“散列分配中奇数个元素”错误的来源。

答案 1 :(得分:8)

尝试:

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

该函数不会被编写为使用->调用。

答案 2 :(得分:0)

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

my $class = shift;
my %args = ( ..., @_ );