我该如何高效地创建一组连续数字的Perl哈希表?

4

我需要创建类似于这样的内容:

my $valueref = {
    1 => 1,
    2 => 2,
    3 => 3,
    4 => 4
};

根据特定条件,它可能是40、50或60。在每种情况下,它都是连续的整数,如示例所示。创建后,它将永远不会更改,只需传递给预先存在的子程序。由于键和值都是连续的,我也可以使用for循环创建哈希表。我想知道创建哈希表的最快和/或最有效的方法是什么?或者是否还有其他方法可以完成它?

4个回答

10
使用map就足够了:
my $valueref = { map { $_ => $_ } 1 .. 40 };

尽管这里可能需要注意的是,其实这是一个数组...

my @array = 0 .. 40;

所以$valueref->{$n}实际上是$array[$n]。我不知道在这种情况下使用哈希表是否有任何好处。


3
为什么不使用push @array, 0..40或者@array = 0..40 - Brad Gilbert

5

我会用map来处理这个问题:

my $highest_value = 50;
my %foo = map { $_ => $_ }  1 .. $highest_value ;

请记住,哈希表中不保证元素的顺序。


5
“一旦创建,它将永远不会被改变,只需传递给已存在的子程序。”

听起来这是一个很好的使用 state 关键字(或闭包)的候选方案:

use feature 'state';

sub foo {

    my ( $param1, $param2, $limit ) = @_;
    state $valueref = { map { $_ => $_ } 0 .. $limit };

    ...
}

这可以让您初始化数据结构,而后无需担心稍后将其作为参数传递。

0

哈希切片?类似这样:

my %hash;
my $count = 10;
@hash{1..$count} = (1..$count);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接