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

时间:2012-09-21 20:21:36

标签: 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);
}

3 个答案:

答案 0 :(得分:8)

use File::Copy qw( );  # Don't import anything.

答案 1 :(得分: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

答案 2 :(得分:0)

通过为标识符添加前缀!在导出列表中,您可以取消导出它。

在下面的示例中,move以及copy正在被调用。 move会产生错误,因为它无法找到指定的文件。我们对copy的定义取代copy。如果删除该行,您会发现对copy的调用将导致未定义的函数。

% perl <<'EOF'
use File::Copy qw(!copy);

sub copy { print "Hello world!\n" };

move("a", "b") or print "$!\n";
copy("a", "b") or print "$!\n";
EOF
No such file or directory
Hello world!