如何写出或读入数组的Perl哈希?

时间:2008-12-17 02:50:34

标签: perl arrays hash

我在Perl中有一个程序我正在处理我需要多个键的位置,以及为每个键赋予多个值的方法,并通过能够读取它们并将它们写入外部文件来实现如果密钥与人输入标准输入的内容匹配。我查看了几个站点并发现信息在读取数组哈希时有些有用,但没有写出来,我还需要能够在外部文件中添加到数组中。

这可能吗?

编辑: 有没有办法可以用启动器Perl完成?我是初学者。数组的哈希似乎是使它工作的最佳方式,但我真正需要的是一种方法来显示同一个键的多个值,同时只显示一次键。

3 个答案:

答案 0 :(得分:15)

查看Data::Dumper

例如,这个微观剧本:

#!/bin/perl -w
use strict;
use Data::Dumper;

my(%hash);

$hash{key1} = [ 1, "b", "c" ];
$hash{key2} = [ 4.56, "g", "2008-12-16 19:10 -08:00" ];

print Dumper(\%hash);

生成此输出,可以清楚地编辑:

$VAR1 = {
          'key2' => [
                      '4.56',
                      'g',
                      '2008-12-16 19:10 -08:00'
                    ],
          'key1' => [
                      1,
                      'b',
                      'c'
                    ]
        };

还可以评估它以将数据读回程序。


扩展示例以显示读入和打印输出...请注意,代码位于两个主要块中,块之间唯一的共同变量是文件名。

#!/bin/perl -w
use strict;
use Data::Dumper;
use FileHandle;

my $file = "data.out";

{
    my(%hash);

    $hash{key1} = [ 1, "b", "c" ];
    $hash{key2} = [ 4.56, "g", "2008-12-16 19:10 -08:00" ];

    my $str = Data::Dumper->Dump([ \%hash ], [ '$hashref' ]);
    print "Output: $str";

    my($out) = new FileHandle ">$file";
    print $out $str;
    close $out;
}

{
    my($in) = new FileHandle "<$file";
    local($/) = "";
    my($str) = <$in>;
    close $in;

    print "Input: $str";

    my($hashref);
    eval $str;
    my(%hash) = %$hashref;

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

该脚本的输出是:

Output: $hashref = {
         'key2' => [
                     '4.56',
                     'g',
                     '2008-12-16 19:10 -08:00'
                   ],
         'key1' => [
                     1,
                     'b',
                     'c'
                   ]
       };
Input: $hashref = {
         'key2' => [
                     '4.56',
                     'g',
                     '2008-12-16 19:10 -08:00'
                   ],
         'key1' => [
                     1,
                     'b',
                     'c'
                   ]
       };
key1: 1 b c
key2: 4.56 g 2008-12-16 19:10 -08:00

答案 1 :(得分:3)

由于您提到存储和检索数据,我建议Data::DumperStorable的组合。 例如:

use Data::Dumper;
use Storable;
my %test = (this => ['that', 'the', 'other'],
            that => ['this', 'the', 'other']
            );

Data :: Dumper是为最终用户显示此数据的好方法:

warn Dumper(\%test);

但是对于存储和检索,Storable使这很容易:

# Save the hash to a file:
store \%test, 'file.txt';
# Retrieve the hash from the file.
my $testref = retrieve('file.txt');

检索之后,您应该会发现自己使用原始数据的hashref。

答案 2 :(得分:2)

查看模块XML::Simple。它具有函数XMLout,它将任意项的散列转换为XML,然后转换为反向的函数XML。