在 2 个不同的 CPAN 模块中具有相同名称的子程序

Subroutine with same name in 2 different CPAN modules

提问人:Marcos Camargo 提问时间:3/16/2023 最后编辑:toolicMarcos Camargo 更新时间:3/16/2023 访问量:103

问:

运行perl时出现此错误:

[2023 年 3 月 16 日星期四 00:24:23] list_directory_1.cgi:子程序 main::getcwd 在 /usr/lib/cgi-bin/list_directory_1.cgi 行重新定义 15.

我认为它来自CPAN模块和.如何指定要从模块中获取此子例程?getcwdCwdPOSIXCwd

Perl 模块 子例程

评论

0赞 Marcos Camargo 3/16/2023
我改为:使用 Cwd qw(cwd);这是正确的吗?如果我只使用 seek 函数,我需要为 POSIX 更改什么?您如何找出可用的符号?
0赞 ikegami 3/16/2023
use POSIX qw( seek );.除了是内置的。无需用 POSIX 中的内置覆盖。seekseek

答:

10赞 ikegami 3/16/2023 #1

事实上,默认情况下,Cwd 和 POSIX 都会导出。getcwd

$ perl -we'use Cwd; use POSIX;'
Subroutine main::getcwd redefined at -e line 1.

解决方案是仅导入您需要的符号。

use Cwd      qw( abs_path );
use POSIX    qw( strftime floor );
use DateTime qw( );                  # Import nothing.

如果您始终采用这种显式列出导入的样式,您将获得能够一目了然地看到潜艇来源的好处。

4赞 brian d foy 3/16/2023 #2

除了池上已经展示的内容之外,还有另一条路要走。而不是导入,完全指定您想要的:

use Cwd ();  # import nothing

my $dir = Cwd::getcwd();

如果人们知道该函数可以来自不同的来源,但不记得您选择了哪个来源,这会很有帮助。