【问题标题】:Perl - undefined subroutinePerl - 未定义的子例程
【发布时间】:2013-08-13 06:25:15
【问题描述】:

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

【问题讨论】:

  • 好吧,我刚刚尝试将我的代码更改为具有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

标签: perl subroutine


【解决方案1】:

看看代码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_defaultsIO::Socket::SSL 导出到哪里了
  • 如果你想避免导入,你可以使用Email::Sender::Simple->send(...)而不是Email::Sender::Simple::sendmail(...)
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多