Perl - 未定义的子例程

4

I have the following Perl code:

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

我刚刚尝试更改我的代码,加入了 use IO::Socket::SSL qw(set_defaults);set_defaults(SSL_verify_mode => SSL_VERIFY_NONE);,但是出现了一个错误,提示 "set_defaults" is not exported by the IO::Socket::SSL module - pacoverflow
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仍然可以被导出。

也许细节有点多,但我可以看出set_defaults是由IO::Socket::SSL导出的。 - justintime
如果你想避免导入,你可以使用 Email::Sender::Simple->send(...) 代替 Email::Sender::Simple::sendmail(...) - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接