Perl:将文件加载到哈希中

时间:2015-04-27 19:26:36

标签: arrays perl file hash

我正在努力理解Perl中哈希背后的逻辑。任务是将文件加载到哈希并将值分配给使用此文件创建的键。

文件包含每个字母的字母:

a
b
c
d
e

等。 当使用数组而不是哈希时,逻辑很简单:将文件加载到数组中,然后使用一些计数器($ counter ++)打印具有相应数字的每个元素。

但现在我的问题是,如何将文件读入我的哈希值,分配自动生成的值并按照这样输出的方式对其进行排序:

a:1
b:2
c:3

我尝试先创建数组,然后使用

将其链接到哈希
%hash = @array

但它使我的哈希值无法排序。

3 个答案:

答案 0 :(得分:4)

有很多方法可以解决这个问题。最直接的方法是在读取文件时将数据加载到哈希值中。

my %hash;
while(<>)
{
    chomp;
    $hash{$_} = $.;    #Use the line number as your autogenerated counter.
}

如果您已经有一个填充的数组,也可以执行simliar逻辑。

for (0..$#array)
{
    $hash{$array[$_]} = $_;
}

虽然,如果您处于这种情况,map是处理事务的方式。

%hash = map { $array[$_] => $_ } @array;

答案 1 :(得分:2)

将散列视为一组对(键,值),其中键必须是唯一的。您希望一次读取一行文件,并在散列中添加一对:

$record = <$file_handle>;
$hash{$record} = $counter++;

当然,您可以立即将整个文件读入数组,然后分配给您的哈希。但解决方案不是:

@records = <$file_handle>;
%hash = @records;

......你发现了。如果您根据(键,值)对进行思考,您将看到上述内容等同于:

$hash{a} = 'b';
$hash{c} = 'd';
$hash{e} = 'f';
...

等等。你仍然需要一个循环,或者是一个明确的循环:

foreach my $rec (@records)
{
    $hash{$rec} = $counter++;
}

或其中一个隐含的:

%hash = map {$_ => $counter++} @records;
# or:
$hash{$_} = $counter++  for @records;

答案 2 :(得分:2)

此代码应生成正确的输出,其中my-text-file是数据文件的路径:

my %hash;
my $counter = 0;
open(FILE, "my-text-file");
while (<FILE>) {
 chomp;
 $counter++;
 $hash{$_} = $counter;
}
# Now to sort
foreach $key (sort(keys(%hash))) {
 print $key . ":" . $hash{$key} . "\n";
}

我假设你想要对aplhabetically进行排序。 keys(%hash)values(%hash)分别将%hash的键和值作为数组返回。在此文件上运行该程序:

f
a
b
d
e
c

我们得到:

a:2
b:3
c:6
d:4
e:5
f:1

我希望这会对你有所帮助。