Как эффективно создать Perl-хэш из последовательных чисел? - PullRequest
4 голосов
/ 02 января 2012

Мне нужно создать что-то вроде этого:

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

На основе определенных условий это может быть до 40, или 50, или 60. В каждом случае это будут последовательные целые числа, как показано впример.После создания он никогда не будет изменен, просто передан в существующую подпрограмму.Поскольку и ключи, и значения будут последовательными, я также мог бы создать хеш, используя цикл for.Мне было любопытно, что будет самым быстрым и / или наиболее эффективным способом создания хэша?Или если бы был еще один способ сделать это?

Ответы [ 4 ]

10 голосов
/ 02 января 2012

Достаточно использовать карту:

my $valueref = { map { $_ => $_ } 1 .. 40 };

Хотя здесь можно заметить, что на самом деле это массив ...

my @array = 0 .. 40;

Так что $valueref->{$n} на самом деле $array[$n]. Я не знаю, есть ли какая-либо польза от использования хеша в этом случае.

5 голосов
/ 02 января 2012

"После создания он никогда не будет изменен, просто передан существующей подпрограмме"


Звучит как хороший кандидат на state ключевое слово (или замыкание):

use feature 'state';

sub foo {

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

    ...
}

Это позволяет инициализировать структуру данных и не беспокоиться о передаче ее в качестве аргумента позже.

5 голосов
/ 02 января 2012

Я бы, вероятно, использовал для этого map:

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

Помните, что порядок не гарантируется в хэше.

0 голосов
/ 04 января 2012

Кусочек хеша? Примерно так:

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