2016-06-16 23 views
0

私は2つのファイル(jsonファイルとpidファイル)を持っています。 JSONファイルのフォーマットは次のとおりです。pidのためjsonをハッシュにして、このハッシュとperlの別のハッシュを比較する

{ 
"connection": { 
    "file": { 
    "file_connection_1": { 
    "CLOUD_AUTHENTICATION": "", 
    "CLOUD_CONN_PROTOCOL": "", 
    "CONN_NAME": "file_connection_1", 
    "FILE_DIR": "/home/directory" 
    } 
    } 
} 
} 

フォーマット:。

<General> 
"CLOUD_AUTHENTICATION": "YES" 
"CLOUD_CONN_PROTOCOL": "PRTCL" 
"CONN_NAME": "file_connection_1" 
"FILE_DIR": "/home/directory" 
</General> 

私はハッシュの中に両方のファイルを変換してから、キー(例えばCLOUD_AUTHENTICATIONまたはCLOUD_CONN_PROTOCOLの値を比較したいです。.. )。 pidから値を取得し、存在しなければjsonファイルハッシュに挿入します。 ファイルをハッシュに変換できますが、キーを比較してpidハッシュからjsonハッシュに値をコピーする方法については明確ではありません。

+0

ここではどのように.........この2つの点はあなたの質問では見逃されています。どこに - >サーバー側またはフロントエンドとあなたが使用している言語。 – Hemakumar

+3

@Hemaタグと質問のタイトルによれば、OPはPerlを使用しています。 – ThisSuitIsBlackNot

+0

既に持っているコードを追加する必要があります。どのようにファイルをハッシュに変換しますか?結果のデータ構造はどのように見えるのですか?見せる。これらの詳細を追加するには、質問を編集することができます。 – simbabque

答えて

2

私が質問を理解する方法は、同じキーを持つ2つのハッシュです。最初のキーが特定のキーの値を持っていない場合は、そこにある別のハッシュの値を入れたいとします。

これらのハッシュをどのように作成するのかわからなかったので、私は自分の解決策を考え出しました。あなたはおそらくそれを無視することができます。私はConfig::Generalを使用して、":を削除してpidファイルを読みとって、JSONのためにJSONを使用しました。

use strict; 
use warnings; 
use Config::General; 
use JSON 'decode_json'; 
use Data::Dumper; 

# read the pid file 
my %cfg_pid = Config::General->new(
    -NormalizeOption => sub { my $x = shift; $x =~ s/^"|":$//g; $x; }, 
    -NormalizeValue => sub { my $x = shift; $x =~ s/^"|"$//g; $x }, 
    -ConfigFile  => \*DATA 
)->getall; 

# read the json file 
my $json = <<'JSON'; 
{ 
"connection": { 
    "file": { 
    "file_connection_1": { 
    "CLOUD_AUTHENTICATION": "", 
    "CLOUD_CONN_PROTOCOL": "", 
    "CONN_NAME": "file_connection_1", 
    "FILE_DIR": "/home/directory" 
    } 
    } 
} 
} 
JSON 

my $cfg_json = decode_json($json); 

# this is before 
print Dumper $cfg_json; 

# actual part that you want 
foreach my $key (keys %{ $cfg_pid{General} }) { 
    $cfg_json->{connection}->{file}->{file_connection_1}->{$key} = $cfg_pid{General}->{$key} 
     unless $cfg_json->{connection}->{file}->{file_connection_1}->{$key}; 
} 

# and this is after 
print Dumper $cfg_json; 

__DATA__ 
<General> 
"CLOUD_AUTHENTICATION": "YES" 
"CLOUD_CONN_PROTOCOL": "PRTCL" 
"CONN_NAME": "file_connection_1" 
"FILE_DIR": "/home/directory" 
</General> 

それは本当にありませんすべては、pidファイルのハッシュのキーを反復処理し、そのキーの値がある場合は、JSONのハッシュをチェックインです。その値が真でない場合(つまり、キーが存在しない場合、値は、空の文字列はq{}または0)、これをpidファイルハッシュの値に設定します。もちろん空の文字列を明示的にチェックすることもできます。

出力は次のとおりです。

$VAR1 = { 
    'connection' => { 
     'file' => { 
      'file_connection_1' => { 
       'FILE_DIR'    => '/home/directory', 
       'CONN_NAME'   => 'file_connection_1', 
       'CLOUD_CONN_PROTOCOL' => '', 
       'CLOUD_AUTHENTICATION' => '' 
      } 
     } 
    } 
}; 
$VAR1 = { 
    'connection' => { 
     'file' => { 
      'file_connection_1' => { 
       'FILE_DIR'    => '/home/directory', 
       'CONN_NAME'   => 'file_connection_1', 
       'CLOUD_CONN_PROTOCOL' => 'PRTCL', 
       'CLOUD_AUTHENTICATION' => 'YES' 
      } 
     } 
    } 
}; 
+0

ありがとう@シンバブキ。あなたと同じ方法でファイルをハッシュに変換しました。申し訳ありませんが、私はコードを提供しませんでした。あなたの答えは、正しい結果を与えているようだが、私はそれらの値をハードコードしたくない。私はちょうどあなたにjsonの一部を与えました。私が使用しているjsonには、「接続」や異なるサブカテゴリのような5~10のカテゴリがあります。私はすべてのカテゴリをハードコードすることはできません。また、私はpidからjsonへのキーを比較することを考えていました。そしてそれが一致すると、値を取得します。私は異なる構造化されたハッシュのキーを比較する方法を知らない。 – JustStarted

+0

また、$ keyの前の値(ハッシュ参照名)が 'file_connection_1'の場合、 '$ cfg_json - > {connection} - > {file} - > {file_connection_1} - > {$ key}'チェックすることができます'または'ファイル 'に等しい2番目の最後の値(ハッシュ参照名)? – JustStarted

+0

@JustStarted質問を更新し、両方のファイルに第2のカテゴリを追加してください。カテゴリが動的であるとは言及していませんでした。私はあなたの2番目のコメントの意味を理解していません。それを違う方法で試してみてください。 – simbabque

関連する問題