4

我有以下 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);
4

1 回答 1

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)的最大优势是它能够构建新的导出代码引用,而不是简单地导出与导出包中相同的代码。

哦...

因此,使用的目的Sub::Exporter导出不是包中子例程的子例程名称。

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

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

于 2013-08-12T02:23:09.270 回答