Como posso obter Perl para dar uma mensagem de aviso quando um pacote certo / tag é importado?

StackOverflow https://stackoverflow.com/questions/187531

Pergunta

Eu tenho um pacote que acabou de fazer e eu tenho um "velho modo" que, basicamente, faz com que funcione como funcionou antes: importar tudo no namespace atual. Uma das coisas agradáveis ??sobre ter isso como um pacote é que não temos mais de fazer isso. Enfim, o que eu gostaria de fazer é tê-lo de modo que sempre que alguém faz:

use Foo qw(:oldmode);

Eu lanço um aviso de que este é obsoleto e que eles devem quer importar apenas o que eles precisam ou funções de acesso apenas com foo-> fun ();

Algumas ideias sobre como fazer isso?

Foi útil?

Solução

Bem, como você especificamente estado que pretende alarme nos casos de use Mod qw<:oldmode>; Isso funciona melhor:

package Foo;
use base qw<Exporter>;
use Carp qw<carp>;
...
sub import { 
    #if ( grep { $_ eq ':oldmode' } @_ ) { # Perl 5.8
    if ( @_ ~~ ':oldmode' ) {              # Perl 5.10 
        carp( 'import called with :oldmode!' );
    }
    goto &{Exporter->can( 'import' )};
}

Graças a Frew, para mencionar o inteligente sintaxe jogo Perl 5.10. Estou aprendendo todas as formas de trabalho Perl 5.10 em meu código.

Nota: a maneira padrão de uso exportador em uma sub importação, quer seja para manipular $Exporter::ExportLevel ou para Foo->export_to_level( 1, @_ ); chamada Mas eu gosto da maneira acima. É mais rápido e, penso eu, mais simples.

Outras dicas

Você escreve seu próprio sub import em package Foo que será chamada com a lista de parâmetros de use Foo.

Um exemplo:

package Foo;
use Exporter;

sub import {
    warn "called with paramters '@_'";

    # do the real import work
    goto &{Exporter->can('import')};
}

Assim, em sub import você pode pesquisar a lista de argumentos para o tag obsoleta, e depois jogar um aviso.

Atualização : Como Axeman aponta, você deve chamar goto &{Exporter->can('import')}. Esta forma de Goto substitui a chamada sub-rotina corrente na pilha, preservando os argumentos atuais (se houver). Isso é necessário porque a importação do Exportador () método irá exportar para namespace do seu chamador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top