从perl中具有许多转储的文件中检索特定数据转储

时间:2015-04-27 06:28:20

标签: perl dump

我在perl中已经存在的转储文件中附加了数据转储。但是使用eval<>只返回一个数据转储。我将转储命名为$ project1,$ project2等等。我不需要从转储文件中检索$ project2。我怎么做? 这是我的数据转储:

$project1 = {
              'projectname1' => [
                                 {
                                   'media_name' => 'Design Sync',
                                   'dssite' => 'gnb',
                                   'area' => 'qa_dap',
                                   'ldap_list' => 'list1',
                                   'replicate_key' => '2',
                                   'user_num' => '4858',
                                   'role' => '1',
                                   'prj_name' => 'DAP_Rep_Test'
                                 },
                                 {
                                   'media_name' => 'Design Sync',
                                   'dssite' => 'noi',
                                   'area' => 'qa_dap',
                                   'ldap_list' => 'list2',
                                   'replicate_key' => '2',
                                   'user_num' => '4858',
                                   'role' => '1',
                                   'prj_name' => 'TAP_Rep_Test'
                                 }
                                 ]
        };
$project2 = {
              'projectname2' => [
                                 {
                                   'media_name => 'B Sync',
                                   'dssite' => 'agr',
                                   'area' => 'qa_dap',
                                   'ldap_list' => 'list1',
                                   'replicate_key' => '2',
                                   'user_num' => '4858',
                                   'role' => '1',
                                   'prj_name' => 'DAP_Rep_Test'
                                 },
                                 {
                                   'media_name' => 'Design Sync',
                                   'dssite' => 'noi',
                                   'area' => 'qa_dap',
                                   'ldap_list' => 'list2',
                                   'replicate_key' => '2',
                                   'user_num' => '4858',
                                   'role' => '1',
                                   'prj_name' => 'DAP_Rep_Test'
                                 }
                                 ]

        };

我如何获得project2 - > projectname2 - >第一个括号{} ??

的media_name值

这是我编写转储并检索它的perl代码:

# Print structure to file
open my $out, '>>', 'file_dump' or die $!;
my %hash_val;
$hash_val {projectname} = $arrayref;

print {$out} Data::Dumper->Dump([\%hash_val], ["projectname"]), $/;
close $out;

# Read structure back in again
open my $in, '<', 'file_dump' or die $!;
my $data;
{
    local $/;    # slurp mode
        $data = eval <$in>;
}
close $in;

1 个答案:

答案 0 :(得分:0)

Data::Dumper的有用之处在于它可以让您打印数据结构,这样可以更轻松地找出您需要打印的内容。

project2[]表示数组。在您的示例中,它只有一个元素,因此:

$project2 -> projectname2[0]{media_name}

(如用户名中的注释所示,我可以输入; p)

你也可以这样做:

foreach my $thing ( @{ $project2 -> {projectname2} } } { 
    print $thing -> {media_name},"\n";
}

但实际上 - 看起来你正在从错误的方向接近这个问题。 Data::Dumper不适合数据导入/导出。 Storable是一种保存和加载数据结构的方法。

如果以外部程序仍然可读的方式这样做,则可能值得查看JSONXML而非Dumper之类的内容。它最初有点难度,但是会产生更强大,更持久的代码。