Может ли Perl хранить ссылку на массив как хеш-ключ? - PullRequest
4 голосов
/ 21 июня 2010

Рассмотрим следующее:

use strict;
use Data::Dumper;
my $hash={['one','two']=>[1,2]};
print Dumper($hash);
=for comment
prints....
$VAR1 = {
          'ARRAY(0x35358)' => [
                               1,
                               2
                              ]
         };
=cut

В качестве альтернативы ключ в хэше может быть записан как "one \ ttwo", и тогда я могу выделить элементы ключа на основе разделителя табуляции (в последней части программы при сборе данных).

Какой-нибудь совет, как сохранить ключ как ссылку на массив?

Ответы [ 4 ]

6 голосов
/ 21 июня 2010

Нет, обычный (не tie d) хэш Perl только может содержать строки в качестве ключей. Все остальное - arrayrefs, объекты и т. Д. - будет преобразовано в строку, если используется в качестве хеш-ключа, что делает хеш-ключ непригодным для использования, как и любая нестроковая вещь, которую вы изначально имели.

Hash :: MultiKey использует магию tie, чтобы обойти это ограничение.

3 голосов
/ 21 июня 2010
0 голосов
/ 21 июня 2010

Что здесь нужно?Зачем вам искать элемент хеша по массиву?Кажется, дело в HoH, например:

use strict;
use warnings;
use Data::Dumper;
my $hash = { one => { two => [1,2] } };
print Dumper($hash);

печатает

$VAR1 = {
          'one' => {
                     'two' => [
                                1,
                                2
                              ]
                   }
        };

, тем более что вы будете разбивать массив обратно на его элементы позже.Для проверки существования что-то вроде:

if (exists($hash->{one}) && exists($hash->{one}{two}))

необходим &&, так как

if (exists($hash->{one}{two}))

будет автоматически оживлять $ hash -> {one} , если неесть.

0 голосов
/ 21 июня 2010

Вы можете сериализовать структуру данных (например, с помощью Data :: Dumper или другого подобного инструмента) и использовать строку в качестве хеш-ключа:

my $hash = {
    Dumper(['one','two']) => [1,2],
};

Оценить ключ, чтобы вернуть структуру данных.

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