В Perl, как мне создать хеш, ключи которого поступают из данного массива? - PullRequest
75 голосов
/ 18 сентября 2008

Допустим, у меня есть массив, и я знаю, что собираюсь сделать много "Содержит ли массив X?" чеки. Эффективный способ сделать это - превратить этот массив в хеш, где ключами являются элементы массива, а затем вы можете просто сказать

if($hash{X}) { ... }

Есть ли простой способ сделать это преобразование массива в хэш? В идеале он должен быть достаточно универсальным, чтобы брать анонимный массив и возвращать анонимный хеш.

Ответы [ 14 ]

1 голос
/ 05 ноября 2008

Вы можете поместить код в подпрограмму, если не хотите загрязнять свое пространство имен.

my $hash_ref =
  sub{
    my %hash;
    @hash{ @{[ qw'one two three' ]} } = undef;
    return \%hash;
  }->();

Или даже лучше:

sub keylist(@){
  my %hash;
  @hash{@_} = undef;
  return \%hash;
}

my $hash_ref = keylist qw'one two three';

# or

my @key_list = qw'one two three';
my $hash_ref = keylist @key_list;

Если вы действительно хотите передать ссылку на массив:

sub keylist(\@){
  my %hash;
  @hash{ @{$_[0]} } = undef if @_;
  return \%hash;
}

my @key_list = qw'one two three';
my $hash_ref = keylist @key_list;
1 голос
/ 21 сентября 2008

Если вы делаете много теоретических операций над множествами - вы также можете использовать Set :: Scalar или аналогичный модуль. Затем $s = Set::Scalar->new( @array ) создаст для вас набор - и вы можете запросить его с помощью: $s->contains($m).

0 голосов
/ 14 сентября 2011
#!/usr/bin/perl -w

use strict;
use Data::Dumper;

my @a = qw(5 8 2 5 4 8 9);
my @b = qw(7 6 5 4 3 2 1);
my $h = {};

@{$h}{@a} = @b;

print Dumper($h);

дает (обратите внимание, что повторяющиеся ключи получают значение в самой большой позиции в массиве - т.е. 8-> 2, а не 6)

$VAR1 = {
          '8' => '2',
          '4' => '3',
          '9' => '1',
          '2' => '5',
          '5' => '4'
        };
0 голосов
/ 19 сентября 2008

Вы также можете проверить Tie :: IxHash , который реализует упорядоченные ассоциативные массивы. Это позволит вам выполнять оба типа поиска (хэш и индекс) для одной копии ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...