Wie kann ich Perl eine Warnmeldung zu geben, wenn ein bestimmtes Paket / Tag importiert wird?

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

Frage

Ich habe ein Paket, das ich gerade gemacht, und ich habe einen „alten-Modus“, die es im Grunde macht arbeiten, wie es vorher gearbeitet: alles in den aktuellen Namensraum zu importieren. Eines der schönen Dinge über diese als Paket ist, dass wir nicht mehr zu tun haben. Wie auch immer, was würde Ich mag es zu tun hat, so dass, wenn jemand tut:

use Foo qw(:oldmode);

ich eine Warnung werfen, dass diese veraltet ist und dass sie entweder nur Import, was sie brauchen oder einfach nur Zugriffsfunktionen mit foo-> fun ();

Alle Ideen, wie dies zu tun?

War es hilfreich?

Lösung

Nun, wie Sie ausdrücklich festgelegt, dass Sie in den Fällen von use Mod qw<:oldmode>; beunruhigen wollen Das funktioniert besser:

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

Dank Frew, für die Smart-Match Syntax Perl 5.10 zu erwähnen. Ich lerne alle Möglichkeiten, wie Perl 5.10 in meinen Code zu arbeiten.

Hinweis: der normale Weg Exporteur in einer Importunter zu verwenden ist, um entweder zu manipulieren $Exporter::ExportLevel oder Foo->export_to_level( 1, @_ ); zu nennen, aber Ich mag die Art und Weise oben. Es ist schneller und, glaube ich, einfacher.

Andere Tipps

Sie schreiben Ihre eigene sub import in package Foo, die mit der Parameterliste von use Foo genannt werden erhalten.

Ein Beispiel:

package Foo;
use Exporter;

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

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

So in Unter import können Sie die Argumentliste für den veralteten Tag suchen, und dann eine Warnung werfen.

Update : Wie Axeman weist darauf hin, sollten Sie goto &{Exporter->can('import')} nennen. Diese Form des goto ersetzt den aktuellen Unterprogramm-Aufruf auf dem Stapel, um die aktuellen Argumente zu bewahren (falls vorhanden). Das ist notwendig, weil Exporteurs Import () -Methode an seinen Aufrufer Namensraum exportieren wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top