1

我有一个问题:我想为我的模块 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);
}
4

3 回答 3

8
use File::Copy qw( );  # Don't import anything.
于 2012-09-21T20:24:53.873 回答
8

我能想到三种方法

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

  2. 正如 ikegami 建议的那样,不要导入任何东西。或者不要导入所有内容。你可以逃脱

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

  3. 在重新定义之前明确取消定义函数。您必须在编译时执行此操作,因此这属于一个BEGIN块:

    BEGIN { undef © }

    sub copy { ... # redefinition

于 2012-09-21T20:29:51.770 回答
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!
于 2016-08-24T13:14:39.930 回答