【问题标题】:Perl: Load file into hashPerl:将文件加载到哈希中
【发布时间】:2015-07-06 09:51:12
【问题描述】:

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

文件包含字母,每个字母占一行:

a
b
c
d
e

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

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

a:1
b:2
c:3

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

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

但它使我的哈希不可排序。

【问题讨论】:

  • 您指的是哪种“自动生成的值”?就像您使用$counter++ 得到的数字一样?
  • @ASCIIThenANSI 是的,只是一个简单的 $counter++ ,每行都会增加。这个$counter 也应该是我的哈希中键的值,用字母表示:key -> a, value -> 1, key - > b, value -> 2

标签: arrays perl file hash


【解决方案1】:

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

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

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

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

虽然,如果您处于这种情况,map 是更糟糕的做事方式。

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

【讨论】:

  • 哦,那是一个棘手的问题。感谢您的回答,第一个解决方案解决了我的问题。
【解决方案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";
}

我假设您想按字母顺序对哈希进行排序。 keys(%hash)values(%hash) 分别以数组形式返回 %hash 的键和值。在这个文件上运行程序:

f
a
b
d
e
c

我们得到:

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

希望对你有帮助。

【讨论】:

  • 这个解决方案看起来不错,谢谢你的回答。
  • @MagomedSegaIsmailov 没问题!很高兴能提供帮助。
【解决方案3】:

将哈希视为一组对(键、值),其中键必须是唯一的。您想一次读取一行文件,并将一对添加到哈希中:

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

当然,您可以一次将整个文件读入一个数组,然后分配给您的哈希。但解决办法不是:

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

...如您所见。如果你按照 (key, value) 对来思考,你会发现上面的等价于:

$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;

【讨论】:

  • 这是我的问题的众多解决方案之一,感谢您的回答,我将保留它以解决我的进一步问题和任务!
猜你喜欢
  • 2010-09-19
  • 2015-07-07
  • 2012-03-17
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多