是否可以为代码的一部分重新定义要本地化的子例程



是否可以仅为second_routine中的exported_function调用重新定义_function_used_by_exported_function

#!/usr/bin/env perl
use warnings; 
use strict;
use Needed::Module qw(exported_function);

sub first_routine {
    return exported_function( 2 );
}
no warnings 'redefine';
sub Needed::Module::_function_used_by_exported_function {
    return 'B';
}
sub second_routine {
    return exported_function( 5 );
}
say first_routine();
say second_routine();

您可以在sub second_routine中本地重新定义sub _function_used_by_exported_function

package Foo;
use warnings; 
use strict;
use base qw(Exporter);
our @EXPORT = qw(exported_function);
sub exported_function {
  print 10 ** $_[0] + _function_used_by_exported_function();
}
sub _function_used_by_exported_function {
  return 5;
}
package main;
use warnings; 
use strict;
Foo->import; # "use"
sub first_routine {
    return exported_function( 2 );
}
sub second_routine {
    no warnings 'redefine';
    local *Foo::_function_used_by_exported_function = sub { return 2 };
    return exported_function( 5 );
}
say first_routine();
say second_routine();
say first_routine();

我从brian d foy的《掌握Perl》第10章第161页中提取了sub second_routine中的typeglob赋值。sub是通过分配给typeglob来重新定义的,它只替换其中的coderef部分。我使用local只在当前块内执行此操作。这样,外部世界就不会受到更改的影响,正如您在输出中看到的那样。

1051
1000021
1051

相关内容

  • 没有找到相关文章

最新更新