我正在尝试整合this scrip,但我有这样的信息:
无法在@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失败 - 编译在C:/ strawberry / perl / lib / Regexp / Common / Email /中止 地址。第9行。 在(eval 1)第1行的require中编译失败。 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”),事先使用“our”声明,或明确限定为说明全局变量所在的包(使用“::”)。
但我发现这对我来说有点理论上我理解你必须在代码的乞讨时使用句子'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";
}
答案 0 :(得分:11)
我认为问题在于,您确实安装了Regexp::Common::Email::Address
。但是,您还需要Email::Address
,这是一个单独的模块。也就是说,您还应该在C:/strawberry/perl/lib/Email/Address.pm
中安装一个模块。
尝试使用cpan来安装Email::Address
,请参阅What's the easiest way to install a missing Perl module?
更新一点解释:
Perl模块以分层方式组织。 ::
包分隔符等于模块库路径中的目录。模块的全名/含义源自包本身的名称和安装它的路径。假设您有名为Restaurant::Bill
,Hat::Bill
和Names::Male::Bill
的模块。您将拥有三个名为Bill.pm
的不同文件,但它们代表的概念非常不同。它们将通过模块库中的路径彼此区分。