2

Perlersを助けてください!単純な「ここにコードを挿入」アプローチでは、コンパイル時に外部ファイルからコードをパッケージに取り込むことを知っている人はいますか?

バックグラウンド:

私は標準的なPBPスタイルの裏返しのクラスを持っていますが、それはかなり大きくなっています。コードを複数のファイルに分割したいのですが、クラスを拡張したくありません。最適には、コンパイル時に1回、サンプルモジュール(以下を参照)の「MagicJuJu」セクションにコードを挿入するだけです。

私はこれを達成するための手段としてAutoLoaderを見てきました。しかし、私に一時停止を与える2つのことがあります。これらを回避できれば、ほぼ最適な解決策になる可能性があります。

  1. すべての小さなサブを個別のファイルに分割したくありません。適度なサイズのファイルをいくつか追加します(ただし、呼び出し元でサブスタブを使用することは問題ありません)。と

  2. すべてのサブでコンパイルを延期したくありません。私が最初の使用でコンパイルしたいいくつかの潜水艦。ただし、これはおそらく取引を妨げるものではありません。

Mooseが「役割」を提供していることは知っていますが、これはうまくいくと思いますが、さまざまな理由から、Mooseはこのプロジェクトのオプションではなく、Mouseもありません。

「MagicJuJu」の場所で「requireq(some / file)」を使用しましたが、永続変数のスコープが維持されていません。つまり、外部ファイルのサブがオブジェクト属性のハッシュを正しく「認識」していません(まだつまり、requireをファイルの先頭に置くと同じ効果があります)。私は常にセッターとゲッターを使用することでそれを回避することができました。したがって、これは取引を妨げるものではありませんが、コーディング時間と実行オーバーヘッドが少し必要になるため、私は負担しません。

最後に、クラスを拡張したくありません。すでに多重継承があります。単純な「ここにコードを挿入」アプローチで、コンパイル時にコードを1回取り込むだけです。

要約すれば:

  1. (必須)外部ファイルからパッケージ名前空間にコードをインポートします
  2. (必須)コンパイル時または最小限の実行時オーバーヘッドでのみ実行します
  3. (必須)クラスを拡張しません
  4. (望ましい)名誉はロケーションスコープを挿入します

以下の「MagicJuJu」コメント付きのサンプルコード:

package T;

use strict;
use warnings;

########## BEGIN object persistent variables scope block ############
{
  my %Attr_Name_Env;

  ## Constructor 'new'
  #
  sub new {
    ## Get and confirm arguments
    #
    my $class      = shift;
    my $href_arg = {@_};
    my $name_env = $href_arg->{'name_env'};

    ## Bless anon scalar into class
    #
    my $obj_new   = bless anon_scalar(), $class;
    my $idx_self  = ident $obj_new;

    # Populate object attributes
    #
    $Attr_Name_Env{ $idx_self } = $name_env;

    return $obj_new;
  }
  ## END Constructor 'new'

  sub DESTROY {... as you do ...}

  sub t_get_name_env {
    my $self      = shift;
    my $idx_self  = ident $self;
    return $Attr_Name_Env{ $idx_self };
  }

  ## insert magic juju here

}
########## END object persistent variables scope block ############

1;

たぶん、丸呑みと評価のあるBEGINブロック...

4

2 に答える 2

2

モジュールを使用して、必要なサブをインポートすることができます。

use MyMod qw( wanted_sub_1 wanted_sub2 );

import属性ハッシュにアクセスするには、ターゲットモジュール用 に変更する必要があります。

package MyClass;
use MyMod { attrib1 => \%attrib1, attrib2 => \%attrib2 }, qw( wanted_sub1 wanted_sub2 );

MyMod次に、最初のimportハッシュ引数で閉じられるコード参照を作成し、それらをMyClass名前空間にインストールします。

于 2010-02-17T16:55:29.213 に答える
1

結果に耐える気があるなら、Filter::Macroがあります。

于 2010-02-17T16:32:29.787 に答える