6

作成したばかりのパッケージがあり、基本的に以前と同じように機能する「古いモード」があります。すべてを現在の名前空間にインポートします。これをパッケージとして持つことの良い点の 1 つは、もうそれを行う必要がないことです。とにかく、私がやりたいのは、誰かがいつでもできるようにすることです:

use Foo qw(:oldmode);

これは非推奨であり、必要なものだけをインポートするか、Foo->fun(); を使用して関数にアクセスする必要があるという警告をスローします。

これを行う方法についてのアイデアはありますか?

4

2 に答える 2

12

からのパラメーター リストで呼び出される独自の を記述sub importします。package Foouse Foo

例:

package Foo;
use Exporter;

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

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

したがって、サブimportでは、非推奨のタグの引数リストを検索してから、警告をスローできます。

更新: Axeman が指摘しているように、 に電話する必要がありますgoto &{Exporter->can('import')}。この形式の goto は、スタック上の現在のサブルーチン呼び出しを置き換え、現在の引数 (存在する場合) を保持します。Exporter の import() メソッドは呼び出し元の名前空間にエクスポートするため、これが必要です。

于 2008-10-09T14:31:55.147 に答える
11

さて、あなたが具体的に次の場合に警告したいと述べているように、use Mod qw<:oldmode>;これはよりうまく機能します:

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

Perl 5.10 のスマートマッチ構文について言及してくれた Frew に感謝します。Perl 5.10 を自分のコードに組み込む方法をすべて学んでいます。

注: import サブルーチンで exporter を使用する標準的な方法は、操作する$Exporter::ExportLevelか呼び出すFoo->export_to_level( 1, @_ );ことですが、私は上記の方法が好きです。それはより速く、より簡単だと思います。

于 2008-10-09T14:56:10.747 に答える