Come posso fare in modo che Perl emetta un messaggio di avviso quando viene importato un determinato pacchetto / tag?

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

Domanda

Ho un pacchetto che ho appena creato e ho un " old-mode " che fondamentalmente lo fa funzionare come prima: importando tutto nello spazio dei nomi corrente. Una delle cose belle di avere questo come pacchetto è che non dobbiamo più farlo. Comunque, quello che vorrei fare è farlo in modo che ogni volta che qualcuno lo faccia:

use Foo qw(:oldmode);

Lancio un avviso che è deprecato e che dovrebbero importare solo ciò di cui hanno bisogno o semplicemente accedere alle funzioni con Foo - > fun ();

Qualche idea su come farlo?

È stato utile?

Soluzione

Bene, poiché dichiari espressamente di voler allarmare nei casi di use Mod qw<:oldmode>; Funziona meglio:

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' )};
}

Grazie a Frew, per aver menzionato la sintassi della partita intelligente Perl 5.10. Sto imparando tutti i modi per inserire Perl 5.10 nel mio codice.

Nota: il modo standard di utilizzare esportatore in un sottotitolo di importazione è manipolare $Exporter::ExportLevel o chiamare Foo->export_to_level( 1, @_ ); Ma mi piace il modo sopra. È più veloce e, credo, più semplice.

Altri suggerimenti

Scrivi il tuo sub import nel pacchetto Foo che verrà chiamato con l'elenco dei parametri da usa Foo .

Un esempio:

package Foo;
use Exporter;

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

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

Quindi in import puoi cercare nella lista degli argomenti il ??tag deprecato, e poi lanciare un avviso.

Aggiorna : come sottolinea Axeman, dovresti chiamare goto & amp; {Exporter- > can ('import')} . Questa forma di goto sostituisce l'attuale chiamata di subroutine nello stack, preservando gli argomenti correnti (se presenti). Ciò è necessario perché il metodo import () di Exporter verrà esportato nello spazio dei nomi del chiamante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top