首页 > 解决方案 > 要散列的 Perl 数组数字

问题描述

在 Perl 中,我有一个数组

my @array = (1 3 6 12);

从上面的数组中,我想要从一个值映射到下一个值的哈希值并继续。

我希望这样输出。最后一个数字应该映射到它自己的

$VAR1 = {,
          '1'  => '3',
          '3'  => '6',
          '6'  => '12',
          '12' => '12'
        };

这是我试图从 Perl 中的数组中获取哈希的代码

use strict;
use warnings;
use Data::Dumper qw(Dumper);

my @array = qw(1 3 6 12);

my %hash = @array;

print Dumper \%hash;

我得到的输出为:

$VAR1 = {
          '6' => '12',
          '1' => '3'
        };

由于我是 Perl 的初学者,有人可以帮忙吗?

提前致谢

标签: arraysperlhash

解决方案


遍历数组的常用方法是使用for循环来遍历数组的元素。

for (@values) {
  say $_;
}

但是在这种情况下,我们需要数组中的每个元素以及数组中的下一个元素。所以遍历数组的索引会更方便。我们使用特殊变量$#values,它为我们提供了数组中的最终索引。

for (0 .. $#values) {
  say "The value at index $_ is $values[$_]"
}

然后我们也可以得到下一个元素:

for (0 .. $#values) {
  say "$values[$_] => $values[$_ + 1]"
}

运行让我们接近我们想要的数据:

1 => 3
3 => 6
6 => 12
Use of uninitialized value in concatenation (.) or string at array2hash line 10.
12 =>

但是因为 12 是数组中的最后一个元素,所以获取下一个元素是没有意义的(Perl 给了我们和undef值——因此是警告)。

在您的示例中,您似乎希望最终元素指向自身。我们可以使用“定义或”运算符 ( //) 来处理:

for (0 .. $#values) {
  say "$values[$_] => ", $values[$_ + 1] // $values[$_];
}

现在剩下的就是将所需的数据存储在哈希中:

my %values_hash;
for (0 .. $#values) {
  $values_hash{$values[$_]} =  $values[$_ + 1] // $values[$_];
}

使用Data::Dumper检查我们的哈希,我们得到:

$VAR1 = {
          '3' => 6,
          '12' => 12,
          '6' => 12,
          '1' => 3
        };

哪个(考虑到哈希是无序的)是我们想要的。

Perl 专家可能会将其重写为:

my %values_hash = map {
  $values[$_] => $values[$_ + 1] // $values[$_]
} 0 .. $#values;

更新:另一种方法是使用散列片。

my %values_hash;
@values_hash{@values} = @values[1 .. $#values, $#values];

推荐阅读