Perl - 具有索引的关联数组

时间:2012-03-12 13:17:10

标签: arrays perl hash

好的,我是Perl的新手但我觉得这个问题只针对Perl Gurus:)

我需要一个很好的解释示例,说明如何存储和保持对从文件读取的数据的控制。  我想使用带索引的关联数组存储它们,然后使用for循环遍历数组并将其打印到屏幕上。  例如:

 my %array;

$array{$1} = [0]

foreach $array (sort values $array)
 print "$value";

像这样的东西。

3 个答案:

答案 0 :(得分:2)

首先,Perl将关联数组称为“哈希”。这是一个简单的例子,它读取文件的行并将它们存储在一个哈希中,以相反的顺序打印它们。我们使用文件的行号$.作为散列键,并简单地将行本身($_)指定为散列值。

#!/usr/bin/env perl
use strict;
use warnings;
my %hash_of_lines;
while (<>) {
    chomp;
    $hash_of_lines{$.} = $_;
}
for my $lineno ( sort { $b <=> $a } keys %hash_of_lines ) {
    printf "%3d %s\n", $lineno, $hash_of_lines{$lineno};
}

答案 1 :(得分:1)

或者通过IO::All中的slurp方法更轻松:

@lines = io('file.txt')->slurp;

如果你正在阅读一个更大的文件,你可能想要锁定文件以防止竞争条件和IO :: All使你在使用文件时很容易锁定文件。

答案 2 :(得分:1)

你很可能根本不想使用哈希(关联数组不再是perl构造)。你所描述的是使用一个数组。哈希用于存储与唯一键连接的数据,用于串行数据的数组。

open my $fh, "<", $inputfile or die $!;
my @array = <$fh>;
print @array;  # will preserve the order of the lines from the file

当然,如果您希望对数据进行排序,则可以使用print sort @array进行排序。

现在,如果已经使用散列完成,那么你可以执行以下操作:

my %hash = map { $_ => 1 } <$fh>;
print sort keys %hash; # will not preserve order

正如您所看到的,最终结果只是您不保留文件的原始顺序,而是必须对其进行排序,或者获得半随机顺序。如果你有相同的线条,那么你一直存在覆盖密钥的风险。这适用于重复数据删除,但不适用于文件内容的真实表示。

您可能会想“但是,如果我使用其他类型的密钥并将该行存储为值,该怎么办?”嗯,当然,您可以采用JRFerguson的建议并使用数字索引。但是你正在使用一个数组,只是放弃了使用正确数组的自然好处。通过这样做,你实际上并没有获得任何东西,只会丢失东西。