В Perl, можем ли мы ввести два значения для одного и того же ключа в хеш, не теряя (перезаписывая) первое? - PullRequest
1 голос
/ 07 апреля 2011

после того, как я объявил хеш в Perl

%hash1=(a=>"turkey",
        b=>"india",
        c=>"england",
        d=>"usa")

если я назначу новое значение уже существующему ключу, например

$hash1{d}="australia";

Я теряю предыдущее значение с ключом 'd', т. Е. "США", потому что, когда я делаю

print %hash1;

я не вижу значения "сша" ... как сохранить оба значения для одного и того же ключа?

Ответы [ 4 ]

12 голосов
/ 07 апреля 2011

Хеш-ключ может содержать только одно скалярное значение, поэтому, если это значение является строкой, вы застряли с одним элементом на ключ.Однако ничто не мешает вам хранить ссылки на массивы (которые также являются скалярами) в качестве значения.Чтобы упростить задачу, вам, вероятно, следует хранить только ссылки на массивы или строки, а не смешивать их:

my %hash1 = (a=>"turkey", b=>"india", c=>"england", d=>"usa");

# upgrade all values to arrays
# $hash1{$_} = [$hash1{$_}] for keys %hash1;   # a way with `keys`
$_ = [$_] for values %hash1;  # a better way with `values`, thanks to ysth

push @{ $hash1{d} }, 'australia';

print "$_ : @{ $hash1{$_} }\n" for keys %hash;
2 голосов
/ 07 апреля 2011

Как сказал ДжонСмит, используйте хэш массива:

my %hash1 = (
    a => ["turkey"],
    b => ["india"],
    c => ["england"],
    d => ["usa"],
);

и используйте его как:

push @{$hash1{d}}, "australia";
0 голосов
/ 07 апреля 2011

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

Один и тот же ответ применим к обоим: нет, конечно, нет, не без изменения класса хранения, механизма доступа или того и другого.Один значит один.Когда вы придумали механизм, который работает для простой неподписанной скалярной переменной, вы сделаете это для всего класса проблем.

0 голосов
/ 07 апреля 2011

вам нужно хранить хэш списков

Пример: http://www.perlmonks.org/?node_id=1977

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