Perl - 未定义的子例程

时间:2013-08-12 01:56:13

标签: perl subroutine

我有以下Perl代码:

use Email::Sender::Simple;
use IO::Socket::SSL;

IO::Socket::SSL::set_defaults(SSL_verify_mode => SSL_VERIFY_NONE);

Email::Sender::Simple::sendmail($email, { transport => $transport });

当我运行它时,我收到此错误:

Undefined subroutine &Email::Sender::Simple::sendmail called at script.pl line 73.

如果我将代码更改为具有以下内容,那么它可以工作:

use Email::Sender::Simple qw(sendmail);

sendmail($email, { transport => $transport });

有人可以解释为什么我必须更改sendmail的代码,而我不必将set_defaults的代码更改为:

use IO::Socket::SSL qw(set_defaults);

set_defaults(SSL_verify_mode => SSL_VERIFY_NONE);

1 个答案:

答案 0 :(得分:4)

查看代码Email/Sendmail/Simple.pm。该程序中没有sendmail子例程。相反,如果你看一下标题,你会看到:

use Sub::Exporter -setup => {
  exports => {
    sendmail        => Sub::Exporter::Util::curry_class('send'),
    try_to_sendmail => Sub::Exporter::Util::curry_class('try_to_send'),
  },
};

我不熟悉Sub::Exporter,但我确实注意到了这个描述。

  

Sub :: Exporter相对于现有出口商(包括无处不在的Exporter.pm)的最大好处是能够为导出构建新的coderef,而不是简单地导出与导出包中的代码相同的代码。

...喔

因此,使用Sub::Exporter的目的是 export 子程序名称,这些名称不是程序包中的子程序。

如果您感兴趣,可以阅读Sub::Exporter的教程,但它似乎能够以不同的名称导出子程序。

因此,Email::Sender::Simple::sendmail不是子例程,但仍可以导出sendmail

相关问题