从文件中读取多级哈希,并将特定值推送到单独的数组

时间:2014-12-16 16:14:23

标签: arrays perl data-structures hash

如果我的标题令人困惑,我道歉。我会试着解释一下。

我正在接替那些突然离开我公司并且几乎没有使用Perl编程经验的人。我的O'Reilly书籍,谷歌和这里的搜索让我陷入了一个越来越混乱的局面,我处于死路。

我有一个自动生成的哈希值,它会定期更新并作为文本文件保存在服务器上。文件内容如下:

$VAR1 = {
   'qa_metrics' => {
      'group_level' => {
      },
      'product_level' => {
         'qa_metric_1' => [ 
            {
            'operator' => '>',
            'limit' => '5',
            }
         ],
         'qa_metric_2' => [ 
            {
            'operator' => '>',
            'limit' => '5',
            }
         ]
      }
   }
   'speed_metrics' => {
      'group_level' => {
         'group_speed_metric_1' => [
            {
            'operator' => '>=',
            'limit' => '6',
            }
         ]
      },
      'product_level' => {
         'speed_metric_1' => [
            {
            'operator' => '>=',
            'limit' => '6',
            }
         ],
          'speed_metric_2' => [
            {
            'operator' => '<=',
            'limit' => '13',
            }
         ]
      }
   }
   'other_metrics' => {
      'product_level' => {
         'other_metric_1' => [
            {
            'operator' => '==',
            'limit' => '1',
            }
         ],
         'other_metric_2' => [
            {
            'operator' => '<',
            'limit' => '3',
            }
         ]
      }
   }
}

我正在开发的项目要求我遍历多级哈希结构,并将所有'product_level'度量标准名称推送到基于度量标准类型的数组中。例如,qa_metric_1qa_metric_2以及该类型的任何其他内容(qa)和级别(product)将在speed_metric_1时被推送到一个数组中, speed_metric_2other_metric_1other_metric_2等会被推送到各自独立的数组中。

一旦数组被填充并包含在,和``或类似内容中,我相信我可以自己从这一点开始。

我应该提一下,我正在使用Perl 5.8,我的能力(意味着来自IT的许可)添加第三方模块几乎不存在。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果您使用Data::Dumper模块,并将其打印到文件中,这看起来就像您所获得的那样。如果您想再次阅读它,我认为这有点不寻常。它是一个调试工具,并且有更好的方式以重新读取的格式提取信息。

我建议首先看看输出出现的位置,并使用Storable(核心模块,我想想它将在5.8)中将其保存到您可以轻松重读的文件中。

如果失败了,虽然可以应用一些黑客来执行此操作。但不要误以为他们是一个很好的解决方案&#39;因为&#39;良好的解决方案&#39;是不是首先要做到这一点!

例如 - 这应该有效,但如果你无法控制文件内容,那就太危险了。 (这基本上是在这个文件中运行一些代码,并希望它没有采取任何可怕的方法。这通常是坏消息,并且要避免)。

请参阅:How do I read back in the output of Data::Dumper?

use strict;
use warnings;

our $VAR1;

open ( my $input_fh, "<", "your_file.txt" );
{
    local $/;     
    $VAR1 = eval <$input_fh>;
    warn $@ if $@;
}

foreach my $key ( keys %{$VAR1} ) {
    print "$key:\n";
 }

有一点需要注意 - 您发布的数据中是否存在拼写错误,您省略了一些逗号?否则它不是有效的数据结构。 (您需要在每个&#39; qa_metricsspeed_metrics等之间使用逗号。

一旦你完成了这个,你就会得到一个哈希,然后你可以用你认为合适的方式进行操作 - 遍历哈希来提取你想要的数据应该相当简单。