我该如何编写或读取Perl的数组哈希表?

4
我正在编写一个Perl程序,需要多个键以及为每个键提供多个值的方法,并且可以根据用户在标准输入中输入的内容读取和写入外部文件。我查看了几个网站,在读取数组哈希方面找到了一些有用的信息,但没有找到如何将其写出的相关信息,并且我还需要能够将其添加到外部文件的数组中。
这是否可能?
编辑: 是否有一种使用初学者Perl就能实现的方法? 数组哈希似乎是使其工作的最佳方式,但我真正需要的是一种显示相同键的多个值的方法,同时只显示一次键。

Data::Dumper示例使用了哈希数组引用。如果你把方括号换成圆括号,就可以把它变成哈希的数组。如果你想要一个键值对应的列表,那么这就是在Perl中实现它的方法,无论你是初学者还是专业人士。 - Jonathan Leffler
我想我理解你的建议,但这是一个需要程序能够在文件不存在时创建外部文件,并且需要能够在有新的标准输入时创建新键的情况。很抱歉我没有在一开始提供所有信息。 - John
3个回答

16

请看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


4

由于你提到了存储和检索数据,我建议使用 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');

在检索完成后,您应该得到一个哈希引用,其中包含原始数据。


如果涉及到数字,你可能想要使用nstore()。n版本以网络顺序存储数据。 - brian d foy

2

请查看模块XML::Simple。它有一个名为XMLout的函数,可以将任意项的哈希转换为XML格式,还有一个名为XMLin的函数,可以反向转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接