如何在Perl中处理子例程重新定义的错误

flo*_*ads 13 perl warnings subroutine

所以我有一个文件,简而言之就是这个问题......

#!/usr/bin/perl -w
package Foo;

use strict;
use POSIX;

...

sub remove {
  ...
}
...
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,说子程序remove已被重新定义.我知道这个问题,remove在POSIX中有一个子程序.但是,我不知道如何处理它.这个问题通常如何解决?

mob*_*mob 22

抑制此警告的另一种方法是将子例程重定义放在no warnings 'redefine'块中:

{
    no warnings 'redefine';
    sub remove { ... }
}
Run Code Online (Sandbox Code Playgroud)


enn*_*ler 20

做这个:

use POSIX ();
Run Code Online (Sandbox Code Playgroud)

这将停止导出POSIX模块的所有默认功能.然后,您需要使用POSIX ::前缀所有POSIX方法,例如:

POSIX::remove(filename)
Run Code Online (Sandbox Code Playgroud)

用于POSIX删除功能.

  • @floogads,更常见的是说`使用POSIX qw(mkfifo modf);`你明确列出要导入的所有函数.这样,您不必全部使用`POSIX ::`前缀,并且您不必担心程序中子程序名称的冲突. (5认同)
  • 是的,一般来说,为了避免子例程定义冲突,最好什么也不导入,或者只导入那些您确定具有唯一名称的子例程。 (2认同)

Eth*_*her 18

您可以使用'!name'指令排除某些符号(请参阅perldoc Exporter),例如:

#!/usr/bin/perl -w
package Foo;

use strict;
use POSIX '!remove';

...

sub remove {
  ...
}
...
Run Code Online (Sandbox Code Playgroud)