2017-12-11 8 views
-1

perlで匿名データ構造を必要とすることはありますか?は匿名データ構造を必要とします

#test.pl 
(
    "example_data" => 1 
) 

#main.pl 
require "test.pl"; 
%some_data = (%some_data, $); 

subsが行うように、1が最後にない場合、暗黙的にデータ構造を返す必要はありますか?

私がやっていることのより具体的な例がここにあります。データオブジェクトは、提供されているものよりもはるかに大きいことに注意してください。

#main.pl 
use Schedular(
    \%CONFIG, 
    do "default.pl" 
); 

#spawn new process for each schedule 
Schedular::run_schedulue("some_schedule"); 
Schedular::run_schedulue("some_other_schedule"); 

#Schedular.pm 

package Schedular; 

our %schedules = undef; 
our %config = undef; 
sub import{ 
    %config= shift @_; 
    %schedules = shift @_; 
} 

sub run_schedule{ 
    #Run each event in schedule 
} 

sub do_something{ 
    print("Hello World"); 
} 

#default.pl 
(
    "some_schedule"=>[ 
     sub { 
      #Event 
      Schedular::do_something(); 
     }, 
     sub { 
      #Event 2 
     } 
    ], 
    "some_other_schedule"=>[ 
     sub { 
      #Event 3 
     }, 
    ] 
) 
1; 

主な目的は、私は簡単にスクリプトロジックのテンプレート/レシピなどのデータオブジェクトを使用して、新しいPerlスクリプトを生成し、Schedularモジュールへの実装を残すことができるようにしたいです。これにより、新しいイベントをスケジュールにプッシュし、そのスケジュールを新しいスケジュールに追加することも容易にできます。

+2

'$ some_data = do" test.pl "; # - > {foo => 1} ' –

+0

ありがとう、ちょうど私が探していたもの – TheAschr

+1

' .pl'ファイルに 'do'(' require'ではなく)を使います。 ( 'require'はモジュールのためです。)そして、本当の値を返すようにしてください。 – ikegami

答えて

0

なぜこれを明確にするのが難しいのかわかりません。

これは具体的な試みです:モジュールのサブからcode referenceを返してください。実行時にコードが返すものは、呼び出し元(および他のモジュール)からのデータによって複雑になります。

モジュールユーザ供給コード

package FuncStubs; 

use warnings; 
use strict; 
use Exporter qw(import); 
our @EXPORT_OK = qw(f_stub); 

sub f_stub { print "In ", __PACKAGE__, ", got: @_\n" } 

1; 

発呼者とのCodeGen.pm

package GiveCode; 

use warnings; 
use strict; 
use Data::Dump qw(pp); 

use FuncStubs qw(f_stub); 

use Exporter qw(import); 
our @EXPORT_OK = qw(get_coderef); 

sub get_coderef { 
    my @pars = @_; 
    # Any variables declared here and used in sub 
    # will still exist in the caller ("closure") 
    my $rc = sub { 
     my @rc_pars = @_; 
     my $data = pp \@rc_pars; # for demo 
     my $hashref = { 
      key => $data, func => \&f_stub 
     }; 
     return $hashref; 
    }; 
    return $rc; 
} 

1; 

とユーティリティFuncStubs.pm、あなたmain.pl

use warnings; 
use strict; 
use Data::Dump qw(dd); 

use CodeGen qw(get_coderef); 

my $data = { from_main => 'some_data' }; 

my $rc = get_coderef($data); 

my $ret = $rc->($data); 
dd $ret; 

$ret->{func}->("From_" . __PACKAGE__) ; 

これは

を印刷10
 
{ func => sub { ... }, key => "[{ from_main => \"some_data\" }]" } 
In FuncStubs, got: From_main 

get_coderefは、$dataを使用してコードリファレンスを作成します。その場合、$rcは独自の引数で任意に実行できます。コード変更のニーズとして、あなたは新しいデータで、再びget_coderefを実行し、ひいては新しい$rcを構築することができ、など

FuncStubsユーザー入力コードのためのあなたの必要性のための私の推測として、$rcを構築するためにも使用されています。

これを使って、あなたが記述しているように機能するシステムを構築することができると思います(しかし、私が完全に理解していないもの)。あなたが話していることと、それがどのように関連しているかどうかを明確にしてください。

+0

私は質問を更新して、物事をクリアしようとしました。おそらく間違いがありますが、それは私が何をしようとしているかを示しています。 – TheAschr

+0

@ TheAschrありがとうございます。私はまだ、特に "_implementation_"とモジュールが何を提供することになっているかという欠点があるという点を見ていません。例。私の答えでは、 'GiveCode'は他のモジュールを読み込むことができます。例えば、関数のための" stubs " '$ rc'はそれらのスタブを気に入ったものとして使うことができます。したがって、 '$ rc'が返されたとき、' main'はその機能を取得します。それはあなたが念頭に置いていることの線に沿っているのですか? – zdim

+0

あなたのコードに多かれ少なかれ私のような機能を伝えることができます。私が見ることができる主な違いは、あなたのアプローチでモジュールを使用してデータをエクスポートし、鉱山ではdoだけを使用するということです。私はオブジェクトファイルをメインプログラムの拡張であるオブジェクトとして厳密に扱っているので、 "use"を使用して複数回インポートする必要はありませんか? "use"はコンパイル時に解釈されるので、特性のようなテンプレートも失われませんか?たとえば、実行時に変更される可能性があります。また、複数回コピーをビルドする必要があるかもしれません。ご協力いただきありがとうございます。 – TheAschr

0

subsが行うように、1が最後にない場合、暗黙的にデータ構造を返す必要はありますか?

これが文書化されているかどうかはわかりませんが、回答は次のとおりです。

ファイルを初めてrequireにすると、サブルーチンのように評価された最後の式の値が返されます(実際はdoのようになります)。しかし、同じファイルのその後のrequireは、単に1を返します。

これは、ファイルから意味のある値を得るためにrequireを使用することは、信頼できる方法ではないことを意味します。他のユーザー(あなたが読み込んだ別のモジュールによって読み込まれたモジュールなど)がファイルを最初に読み込んだ場合は、1と表示されます。

関連する問題