我有以下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);
答案 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
。