是否有可能重新定义子程序进行本地化的代码的一部分吗?(Is it possible to redef

2019-10-17 02:31发布

是否有可能重新定义_function_used_by_exported_function只为exported_function呼叫second_routine

#!/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();

Answer 1:

您可以在本地重新定义sub _function_used_by_exported_function您的内部sub second_routine

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();

我把里面的类型团赋值sub second_routine布赖恩d FOY的掌握Perl中 ,第10章第161页上的子被分配给类型团,这只是取代了它的CODEREF部分重新定义。 我用local只做当前块内。 这样一来,外面的世界是不会受到改变,因为你可以在输出中看到。

1051
1000021
1051


文章来源: Is it possible to redefine subroutines to be localized for a part of the code?