1

是否可以重新定义_function_used_by_exported_functiononly 中的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();
4

1 回答 1

8

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我从 brian d foy 的Mastering Perl第 161 页第 10 章中提取了 typeglob 分配。通过分配给 typeglob 重新定义了 sub,它只替换了它的 coderef 部分。我local过去只在当前块内执行此操作。这样,外部世界就不会受到变化的影响,正如您在输出中看到的那样。

1051
1000021
1051
于 2012-08-02T08:26:43.270 回答