【问题标题】:How to pass parameters when getting "Odd number of elements in hash assignment"获取“哈希分配中的奇数个元素”时如何传递参数
【发布时间】:2023-03-16 05:25:01
【问题描述】:

我在 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 的第一行。

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

【问题讨论】:

    标签: perl rt


    【解决方案1】:

    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'
    );
    

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

    【讨论】:

    • 感谢您对 -> 上下文中 @_ 含义的补充说明。
    • @Reuben:@_ array 是函数的参数列表,函数在 Perl 中是可变参数(当然有例外),所以你可以在 @_ 中获取所有参数,然后通过手。
    【解决方案2】:

    试试:

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

    该函数不是为使用-> 调用而编写的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-04-15
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        相关资源
        最近更新 更多