2016-06-15 39 views
2

私はいくつかのテストを行うためのconfig.fileを持っていますが、私はこれもいくつかの値を取得したいと思います。Perlでハッシュのハッシュからいくつかの値を取得する方法

ここに私のconfig.file:

my $folder = 'E:\FOLDER\Test\WEB'; 
{ 
     license => [ 'kit-licence.zip', 
        'kit-work.zip' 
        ], 
     programs => [ 
      #template society =>\%program_work 
      'VIKTOR DESCRIPTION PRODUCT' => { 
        name => 'VIKTOR ', 
        parameters => [ 
          Count_id       => '06 (Viktor)', 
          Birth_date     => '1995-04-30', 
          Marriage_date    => '2014-05-26', 
          Divorce_date    => '2015-03-30', 
          Activities_folder    => $folder.'\VIKTOR\independent worker', 
          Activities_format    => 'Enterprise Format (V35)', 
          Description_File_from  => $folder.'\VIKTOR\FILE\description.xlm', 

        ] 
      }, 

      'OLIVER NEW OBJECT' => { 
        name => 'OLIVER ', 
        parameters => [ 
          Count_id       => '06 (oliver)', 
          Birth_date     => '1990-04-30', 
          Marriage_date    => '2011-03-26', 
          Divorce_date    => '2014-01-30', 
          Activities_folder    => $folder.'\OLIVER\independent worker', 
          Activities_format    => 'Enterprise Format (V35)', 
          Description_File_from  => $folder.'\OLIVER\FILE\description.xlm', 

        ] 
      }, 
     ] 
}; 

マイファイルのテストは以下の通りです:

%programs = @{ $config->{programs} }; 
    for my $prog (values %programs) { 
     my %param = @{ $prog->{parameters} }; 
     for my $name (sort keys %param){ 
     print $name, ': ', $param{$name},"\n"; 
     } 
    } 

#test.pl 
use Modern::Perl; 
my $config = do 'work.conf'; 
use Data::Dumper; 
say Dumper($config); 

を例えばヴィクトルのためのプログラムでパラメータを取得するには、私はこれを行うことができます

私の場合、すべてのユーザーにパラメータを取得できるようにしたいと考えています。ここはViktorのためのものです。私はOliverまたは他のユーザーのためにそれらを入手したいと思います。そのために、そしてすべてのユーザーを区別するために、私はすべてのユーザーを区別するための名前である "テンプレート社会"を使用しなければなりません。たとえば、Viktorの場合は、「VIKTOR DESCRIPTION PRODUCT」です。オリバーにとって: "OLIVER NEW OBJECT"。

どうすればいいですか? 「ライセンス」のための

同じこと:

license => [ 'kit-licence.zip', 
       'kit-work.zip' 
        ], 
     programs => [.. 

私は、一つ一つの名前でライセンスを取得したいと思います。たとえば、「kit-license.zip」と入力します。

そのように「ハードコーディング」によって

そしてません:ループの中でおそらく

use File::Spec::Functions qw/catfile/; 
my $filename = catfile($::svn, ${$config->{license}}[0]); 
my $filename1 = catfile($::svn, ${$config->{license}}[1]); 

が、私は見つけることができませんでした。

PS:なぜ彼らがすべて離婚したのか聞かないでください。私は本当に知らない。

+1

私は離婚状態について疑問に思うのではなく、このデータ構造はとても奇妙である理由についてではないでしょうそれを得るためにarchive.orgを使用しています。 – simbabque

答えて

2

これらの配列のリファレンスをハッシュに変換する作業は、既にうまくやっています。しかし、valuesはあなたの人生を苦労させています。キーと値が同時に必要です。あなたはeachを使ってそれを行うことができます。それは完了だ後

VIKTOR DESCRIPTION PRODUCT 
    Activities_folder: \VIKTOR\independent worker 
    Activities_format: Enterprise Format (V35) 
    Birth_date: 1995-04-30 
    Count_id: 06 (Viktor) 
    Description_File_from: \VIKTOR\FILE\description.xlm 
    Divorce_date: 2015-03-30 
    Marriage_date: 2014-05-26 
OLIVER NEW OBJECT 
    Activities_folder: \OLIVER\independent worker 
    Activities_format: Enterprise Format (V35) 
    Birth_date: 1990-04-30 
    Count_id: 06 (oliver) 
    Description_File_from: \OLIVER\FILE\description.xlm 
    Divorce_date: 2014-01-30 
    Marriage_date: 2011-03-26 

each内蔵のリターンキーの両方と反復ごとのハッシュの値、およびundef

my %programs = @{ $config->{programs} }; 
while (my ($template_society, $value) = each %programs) { 
    my %param = @{ $value->{parameters} }; 
    print "$template_society\n"; 
    for my $name (sort keys %param) { 
     print "\t", $name, ': ', $param{$name}, "\n"; 
    } 
} 

この

は、次のような出力を生成します。そのため、ループを whileループに入れる必要があります。

あなたがeachアプローチが気に入らない場合は、キー($template_society)を取得し、適切な値をルックアップするためにそれを使用するkeysの代わりvaluesを使用することができます。

my %programs = @{ $config->{programs} }; 
foreach my $template_society (keys %programs) { 
    my %param = @{ $programs{$template_society}->{parameters} }; 
    print "$template_society\n"; 
    for my $name (sort keys %param) { 
     print "\t", $name, ': ', $param{$name}, "\n"; 
    } 
} 

これにより、同じ出力が得られます。


ライセンスパスをすべて取得するには、それらをアレイに格納し、ループを使用してその配列に配列refを処理する必要があります。最も簡単で最も簡潔な方法はmapです。

my @licences = map { catfile($::svn, $_) } @{ $config->{license} }; 

ループは、foreachループのように短いです。 BLOCKは、基本的に、現在の反復アイテムを$_に取得する関数です。これは本質的に次のようなものです。

my @licences; 
foreach my $licence (@{ $config->{license} }) { 
    push @licences, catfile($::svn, $licence); 
} 

ように動的ではない$foo1のような変数を作成しようとすると、$foo2としています。それは動作しません。 See this 理由については。


最後に$::svnの言葉:あなたがパッケージ内にある場合、あなたは関数にあなたのコードを入れて、引数として$svnを受け入れる必要があります。グローバル変数や別のパッケージからのパッケージ変数を扱うのは面倒で扱いにくいので、ある時点でそれを使って自分自身を撃つでしょう。

1:通常の文書は現在壊れて、私は

+0

ありがとう@シンバブキ。あなたのアプローチはかなり良いです。私はそれを見て理解する時間がかかります。私のポストの第二部、「ライセンス」に関する考えがありますか?前もって感謝します ! – Chaoui05

+0

@ Chaoui05私はその部分を最初に理解しませんでした。しかし、私は今それを得たと思う。名前を格納するには、配列を使用する必要があります。私は更新します。 – simbabque

+0

ありがとう!だから私は好奇心であなたの解決を待っている – Chaoui05

関連する問題