我有一个问题:我想为我的模块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);
}
答案 0 :(得分:8)
use File::Copy qw( ); # Don't import anything.
答案 1 :(得分:8)
我可以想到三种方法
Subroutine ... redefined at ...
消息只是一个警告,而不是错误。如果您“知道他们正在做什么"”,请在重新定义之前致电no warnings "redefine"
。
正如池上所说,不要进口任何东西。或者不要导入所有东西。你可以逃脱
use File::Copy qw(move); # still import move, don't import copy
在重新定义函数之前,请明确取消定义该函数。您必须在编译时执行此操作,因此它属于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!