Come posso fare in modo che Perl emetta un messaggio di avviso quando viene importato un determinato pacchetto / tag?
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?
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.