我有2个文件(json文件和pid文件)。 json文件的格式为:
{
"connection": {
"file": {
"file_connection_1": {
"CLOUD_AUTHENTICATION": "",
"CLOUD_CONN_PROTOCOL": "",
"CONN_NAME": "file_connection_1",
"FILE_DIR": "/home/directory"
}
}
}
}
pid的格式:
<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)
我理解这个问题的方法,你有两个具有相同键的哈希。如果第一个没有某个键的值,则需要将其中的值放在那里。
因为你没有提供如何创建这些哈希值,所以我想出了自己的解决方案。你可以忽略它。我使用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哈希是否有该键的值。如果该值不为真(这意味着密钥不存在,值为undef
,空字符串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'
}
}
}
};