perl - 如何将哈希中的数据存储在文件中并将其用于另一个哈希

标签 perl hash storable

我是 Perl 世界的新手,我需要有关从文件中的散列中保存数据以及之后在另一个散列中使用它的帮助。

这是我的代码的一个简短示例:

#!/usr/local/bin/perl
use FileHandle;
use File::Copy;
use Data::Dumper qw(Dumper);
use Storable;
use warnings;
use strict;

my $user_data;

$user_data->{test_user}->{1256489043}->{STATUS}     =  "RUN";
$user_data->{test_user}->{1256489043}->{MEM}        =  "51591";
$user_data->{test_user}->{1256489043}->{RUN_TIME}   =  "41410";
$user_data->{test_user}->{1256489043}->{PROJ_NAME}  =  "unkown";
$user_data->{test_user}->{1256489043}->{GROUP}      =  "default";
$user_data->{test_user}->{1256489043}->{DATE}       =  "Aug 17 05:23";

$user_data->{test_user_2}->{528562752}->{STATUS}     =  "RUN";
$user_data->{test_user_2}->{528562752}->{MEM}        =  "591";
$user_data->{test_user_2}->{528562752}->{RUN_TIME}   =  "46410";
$user_data->{test_user_2}->{528562752}->{PROJ_NAME}  =  "unkown";
$user_data->{test_user_2}->{528562752}->{GROUP}      =  "default";
$user_data->{test_user_2}->{528562752}->{DATE}       =  "Aug 17 05:23";

store (\$user_data, 'temp_jobs.txt') or die "can't store data to $!";
my $data = retrieve('temp_jobs.txt');

print "Hash 1\n";
print Dumper \$user_data;

print "Hash2\n";
print Dumper \$data;

my @new_array_id;
foreach my $user (keys %{$user_data}) {
   foreach my $job_id (keys %{$user_data->{$user}}) {
      push (@new_array_id, $job_id)
   }
}

my @old_array_id;
foreach my $user (keys %{$data}) {
   foreach my $job_id (keys %{$data->{$user}}) {
      push (@old_array_id, $job_id)
   }
}

这些是 Dumper 打印的输出:

$VAR1 = \{
            'test_user_2' => {
                               '528562752' => {
                                                'GROUP' => 'default',
                                                'PROJ_NAME' => 'unkown',
                                                'DATE' => 'Aug 17 05:23',
                                                'STATUS' => 'RUN',
                                                'RUN_TIME' => '46410',
                                                'MEM' => '591'
                                              }
                             },
            'test_user' => {
                             '1256489043' => {
                                               'GROUP' => 'default',
                                               'PROJ_NAME' => 'unkown',
                                               'DATE' => 'Aug 17 05:23',
                                               'STATUS' => 'RUN',
                                               'RUN_TIME' => '41410',
                                               'MEM' => '51591'
                                             }
                           }
          };

$VAR1 = \\{
              'test_user' => {
                               '1256489043' => {
                                                 'GROUP' => 'default',
                                                 'PROJ_NAME' => 'unkown',
                                                 'DATE' => 'Aug 17 05:23',
                                                 'STATUS' => 'RUN',
                                                 'RUN_TIME' => '41410',
                                                 'MEM' => '51591'
                                               }
                             },
              'test_user_2' => {
                                 '528562752' => {
                                                  'GROUP' => 'default',
                                                  'PROJ_NAME' => 'unkown',
                                                  'DATE' => 'Aug 17 05:23',
                                                  'STATUS' => 'RUN',
                                                  'RUN_TIME' => '46410',
                                                  'MEM' => '591'
                                                }
                               }
            };

在第二个 foreach 循环中观察到错误:

foreach my $user (keys %{$data}) {
   foreach my $job_id (keys %{$data->{$user}}) {
      push (@old_array_id, $job_id)
   }
}

输出:report.pl 中不是 HASH 引用`

实际上,我不确定检索到的数据的类型。您能帮忙将数据保存在新的哈希中吗?

最好的问候, SK

最佳答案

您的 $user_data 变量包含一个哈希引用。哈希引用是一个标量值。我认为您对 documentation for Storable 的概要感到困惑。其中包含这样的示例:

store \%table, 'file';

在上面的例子中,%table 是一个哈希。因此,您需要引用它以便将其传递给 store()。因为你在 $user_data 中拥有的是一个哈希引用,而不是一个哈希,所以在将它传递给 store() 之前你不需要获取它的引用。事实上,通过引用它,您已经添加了额外的间接级别,这会破坏您的代码。

你说:

Actually, I'm not sure about the type of the retrieved data.

它是对哈希引用的引用。但是您的代码只需要一个哈希引用。

最简单的解决方法是替换:

store (\$user_data, 'temp_jobs.txt') ... ;

store ($user_data, 'temp_jobs.txt') ... ;

删除单个字符后,您的两个数据结构相同,并且您的代码按预期工作。

关于perl - 如何将哈希中的数据存储在文件中并将其用于另一个哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63453384/

相关文章:

perl - 在 Perl 中优雅地解析刚性数据

perl - 存储具有 PDL 作为属性的 Moose 对象

perl - Storable 模块是做什么用的?

perl - 如何在 Perl 中识别货币符号?

perl - 我可以使用 Perl 中的 Exporter 导出结构吗?

arrays - 如何将 perl 哈希数组编码为未命名的 JSON 数组?

hash - Redis HMSET 文档 : What does it mean by 'hash' ?

perl - 在 Perl 中打印哈希值

perl - 我在哪里放置用 Storable 卡住的对象,以便将它们用作 Perl 单元测试中的模拟输入?

perl - 将参数传递给脚本,得到 : "Use of uninitialized value $ARGV[0]"