Как я могу элегантно создать хэш из ссылки на массив в Perl? - PullRequest
2 голосов
/ 27 мая 2009

Я ищу более элегантный способ создания хэша, который содержит список, который я прочитал из моего файла конфигурации. Вот мой код:

read_config($config_file => my %config);

my $extension_list_reference = $config{extensions}{ext};

my @ext;

# Store each item of the list into an array

for my $i ( 0 .. (@$extension_list_reference - 1) ) {
    $ext[$i] = $extension_list_reference->[$i];
}

# Create hash with the array elements as the keys

foreach my $entry (@ext) {
    $extensions{$entry} = "include";
 }   

Спасибо.

Ответы [ 4 ]

13 голосов
/ 27 мая 2009

my %hash = map { $_ => 'include' } @list;

6 голосов
/ 27 мая 2009

Попробуйте использовать карту: http://perldoc.perl.org/functions/map.html

Вот как должен выглядеть ваш новый код:

my %extensions = map { $_ => "include" } @{ $config{extensions}{ext} };
2 голосов
/ 27 мая 2009

Если я понимаю вашу проблему, вот как вы делаете это в одной строке:

@extensions{@$extension_list_reference} = ();

Примечание: каждое значение хэша пусто, но вы все еще можете проверить, существует ли ключ в хэше, используя функцию существующие , например:

if(exists $extensions{$some_key}) {...

P.S. Если по какой-то причине вам действительно нужны эти строки 'include' в качестве значений, вы также можете иметь их:

@extensions{@$extension_list_reference} = ('include') x @$extension_list_reference;
1 голос
/ 27 мая 2009

Таким образом:

read_config($config_file => my %config);
%extensions = map +($_ => "include"), @{$config{extensions}{ext}};

или так:

read_config($config_file => my %config);
@extensions{@{$config{extensions}{ext}}} = ("include") x @{$config{extensions}{ext}};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...