3

我正在尝试编译此脚本,但我收到此消息:

无法在 @INC 中找到 Email/Address.pm(@INC 包含:C:/strawberry/perl/lib C:/strawberry/perl/site/lib C:\strawberry\perl\vendor\lib。)在 C: /strawberry/perl/lib/Regexp/Common/Email/Address.pm 第 9 行。BEGIN failed - 编译在 C:/strawberry/perl/lib/Regexp/Common/Email/Address.pm 第 9 行中止。编译失败在 (eval 1) 第 1 行需要。BEGIN 失败--编译在 C:\examples\script2.pl 第 4 行中止。

我不明白,因为我真的有这个根

C:/strawberry/perl/lib/Regexp/Common/Email/Address.pm

当我尝试编译我的脚本时,有人知道为什么我会收到此错误消息吗?

太感谢了


我试着用这句话:

使用 lib 'C:/strawberry/perl/lib/Regexp/Common/Email';

并将这两个句子作为评论:

use Regexp::Common qw[Email::Address];
  use Email::Address

然后我得到这个错误

Global symbol "%RE" requires explicit package name at C:\examples\script2.pl lin
e 10.Execution of C:\examples\script2.pl aborted due to compilation errors.

我看过perldiag

全局符号“%s”需要显式包名 (F) 你说过“use strict”或“use strict vars”,这表明所有变量必须是词法范围的(使用“my”或“state”),声明事先使用“我们的”,或明确限定全局变量在哪个包中(使用“::”)。

但我发现这对我来说有点理论化,因为我知道你必须在代码的乞求处使用句子'use'来使用包。

顺便说一句,这是我的代码:

 use Regexp::Common qw[Email::Address];
  use Email::Address;
  while (<>) {
  my (@found) = /($RE{Email}{Address})/g;
  my (@addrs) = map $_->address, Email::Address->parse("@found");
  print "X-Addresses: ", join(", ", @addrs), "\n";
  }

我从我之前问过的一个问题中得到了这个代码。

4

1 回答 1

11

我认为问题是,您确实已Regexp::Common::Email::Address安装。但是,您还需要Email::Address,这是一个单独的模块。也就是说,您还应该在C:/strawberry/perl/lib/Email/Address.pm.

尝试使用 cpan 安装Email::Address,请参阅安装缺少的 Perl 模块的最简单方法是什么?


更新一点解释:

Perl 模块以分层方式组织。::包分隔符等于模块库路径中的目录。模块的全名/含义来源于包本身的名称和它的安装路径。假设您有名为Restaurant::BillHat::Bill和的模块Names::Male::Bill。您将拥有三个名为 的不同文件Bill.pm,但它们代表的概念非常不同。它们将通过它们在模块库中的路径相互区分。

于 2012-08-16T08:21:02.523 回答