好的,我是Perl的新手但我觉得这个问题只针对Perl Gurus:)
我需要一个很好的解释示例,说明如何存储和保持对从文件读取的数据的控制。 我想使用带索引的关联数组存储它们,然后使用for循环遍历数组并将其打印到屏幕上。 例如:
my %array;
$array{$1} = [0]
foreach $array (sort values $array)
print "$value";
像这样的东西。
答案 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的建议并使用数字索引。但是你正在使用一个数组,只是放弃了使用正确数组的自然好处。通过这样做,你实际上并没有获得任何东西,只会丢失东西。