Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中编写重写导入函数的模块函数_Perl - Fatal编程技术网

如何在perl中编写重写导入函数的模块函数

如何在perl中编写重写导入函数的模块函数,perl,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; Fil

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

我可以想出三种方法

  • 子例程。。。在…
    处重新定义的消息只是一个警告,而不是错误。如果您“知道他们在做什么”,请在重新定义之前调用
    无警告“重新定义”

  • 正如ikegami所建议的,不要进口任何东西。或者不要全部导入。你可以逍遥法外

    使用文件::复制qw(移动);#仍然导入移动,不导入副本

  • 在重新定义函数之前,请显式取消定义该函数。您必须在编译时执行此操作,因此这属于
    BEGIN
    块:

    开始{
    未定义&复制;
    }

    子副本{…#重新定义


  • 我可以想出三种方法

  • 子例程…在…
    处重新定义的消息只是一个警告,而不是错误。如果您“知道他们在做什么”,请在重新定义之前调用
    无警告“重新定义”

  • 正如池上所建议的,不要导入任何东西。或者不要导入所有东西。你可以侥幸逃脱

    使用文件::复制qw(移动);#仍然导入移动,不导入复制

  • 在重新定义函数之前,请显式取消定义它。您必须在编译时执行此操作,因此这属于
    BEGIN
    块:

    开始{
    未定义&复制;
    }

    子副本{…#重新定义


  • 通过在导出列表中为标识符加上!前缀,可以取消导出该标识符

    在下面的示例中,调用了
    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!
    

    %perl通过在导出列表中以!作为标识符的前缀,可以取消导出它

    在下面的示例中,调用了
    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!
    

    %perl为什么不使用其他名称?
    mycopy
    ?perl不关心您使用的名称。因为某些要求。必须使用相同的名称。为什么不使用其他名称?
    mycopy
    ?perl不关心您使用的名称。因为某些要求。必须使用相同的名称。