我正在努力理解Perl中哈希背后的逻辑。任务是将文件加载到哈希并将值分配给使用此文件创建的键。
文件包含每个字母的字母:
a
b
c
d
e
等。 当使用数组而不是哈希时,逻辑很简单:将文件加载到数组中,然后使用一些计数器($ counter ++)打印具有相应数字的每个元素。
但现在我的问题是,如何将文件读入我的哈希值,分配自动生成的值并按照这样输出的方式对其进行排序:
a:1
b:2
c:3
我尝试先创建数组,然后使用
将其链接到哈希%hash = @array
但它使我的哈希值无法排序。
答案 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
我希望这会对你有所帮助。