Как передать параметры при получении «Нечетного числа элементов в присваивании хеша» - PullRequest
3 голосов
/ 30 июня 2011

Я занимаюсь программированием шаблонов в 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), с является первой строкой подпрограммы.

Я знаю, что делаю что-то дурацкое в передаче параметра. Как я должен передавать его?

Ответы [ 3 ]

11 голосов
/ 30 июня 2011

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

И вот откуда возникает ошибка "нечетное количество элементов в назначении хэша".

8 голосов
/ 30 июня 2011

Попробуйте:

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

Функция не написана для вызова с ->.

0 голосов
/ 30 июня 2011

Если вы собираетесь вызывать sub как метод класса, вам нужно ожидать дополнительный неявный аргумент класса:

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