我该如何检查已安装的 Perl 模块的代码?

3
如果我知道某个系统上安装了某个特定的Perl模块,例如MyCompany::Database::Utils,那么我该如何检查此模块的Perl代码?
3个回答

7

通过操作系统提供的任何方式查找源代码文件。

如果你正在寻找已经正确安装的模块,你可以使用perldoc -l命令来查找文件或者使用perldoc -m命令打印文件(感谢@ThisSuitIsBlackNot和@mob):

perldoc -l List::Util
perldoc -m List::Util

如果您的模块名为MyCompany::Database::Utils,则必须将其放在路径MyCompany/Database/Utils.pm下面的@INC路径之一中。
您可以使用以下命令列出默认的@INC路径:
perl -MData::Dumper -e 'print Dumper(\@INC);'

如果您使用的是包含“mlocate”命令的系统(例如大多数Linux/BSD发行版),您也可以使用以下命令查找文件:
locate MyCompany/Database/Utils.pm

如果您想查看完整的源代码(例如查找XS代码,README,单元测试等),可以使用cpanminus的--look标志来查看分发情况:

cpanminus'

cpanm --look DateTime

1
“perldoc -l Foo::Bar”是一种常见的技巧,尽管它并不总是有效。 - ThisSuitIsBlackNot
也许值得补充的是,您必须查看分发源代码才能看到XS代码。 - ThisSuitIsBlackNot
2
如果 perldoc -l Foo::Bar 能够工作,那么 perldoc -m Foo::Bar 也能够工作。 - mob
感谢 @ThisSuitIsBlackNot 和 @mob,我已经将 perldoc -[lm] 添加到答案中。 - kba
@mob perldoc -m 是什么意思? - CJ7
perldoc -m 命令会输出模块的内容,包括 Perl 代码和 POD。 - kba

3
内置的哈希表%INCperldoc perlvar中有文档记录,将每个模块的.pm源文件与其文件系统位置相关联。
如果你有
use MyCompany::Database::Utils;

那么Perl将会在数组@INC中列出的任何目录相对搜索文件,例如MyCompany/Database/Utils.pm,如果找到了该文件,则将其绝对路径放入%INC哈希表中。

要查找每个模块所在的位置,您可以使用Data::DumpData::Dumper来简单地转储整个哈希表。但如果您只对一个模块感兴趣,那么可以检查相关的哈希元素。像这样的语句

print "$INC{'MyCompany/Database/Utils.pm'}\n";

将显示找到并加载该 .pm 文件的绝对路径


3
Perl可以找到模块,因此让Perl告诉您它在哪里找到了它!
perl -e'
   my $p = $ARGV[0];
   $p =~ s{::}{/}g;
   $p .= ".pm";
   require $p;
   print "$INC{$p}\n";
' MyCompany::Database::Utils

如果模块包含POD,您可以使用以下快捷方式:

perldoc -l MyCompany::Database::Utils

如果这不能找到模块,可能是使用MyCompany::Database::Utils的脚本操作了@INC以允许其找到该模块。如果是这样,请在您的脚本中添加以下内容:
END {
   my $p = "MyCompany::Database::Utils";
   $p =~ s{::}{/}g;
   $p .= ".pm";
   print "$INC{$p}\n";
}

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