如何编写一个覆盖perl中导入函数的模块函数

Pei*_* Li 1 perl

我有一个问题:我想为我的模块M编写一个名为"copy"的方法.这个函数是导入函数File :: Copy :: copy的包装器.所以我必须使用File :: Copy :: copy并定义我自己的副本.但它会有一个错误,说复制被重新定义.如何实现我的目标?

#M.pm
package M;
use File::Copy;

#... constructor and other methods

sub copy {
  my $self = shift;
  my $target = shift;
  File::Copy::copy($self->{'PATH'},$target);
}
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 8

use File::Copy qw( );  # Don't import anything.
Run Code Online (Sandbox Code Playgroud)


mob*_*mob 8

我可以想到三种方法

  1. Subroutine ... redefined at ...消息只是一个警告,而不是错误.如果您"知道他们正在做什么",请no warnings "redefine"在重新定义之前致电.

  2. 正如池上所说,不要进口任何东西.或者不要导入所有内容.你可以逃脱

    use File::Copy qw(move); # still import move, don't import copy

  3. 在重新定义之前,请明确取消定义该函数.你必须在编译时这样做,所以这属于一个BEGIN块:

    BEGIN { undef © }

    sub copy { ... # redefinition