2013-10-25 3 views
4

Как печатать пары ключ/значение хэша в том порядке, в котором они были добавлены в хэш.Как печатать элементы хэша в том порядке, в котором они были добавлены в хеш

Например:

%hash = ("a", "1", "b", "2", "c", "3"); 
while (($key, $value) = each %hash) { 
    print "$key", "$value\n"; 
} 

Приведенные выше результаты в следующем:

c3 
a1 
b2 

Я искал способ напечатать следующее:

a1 
b2 
c3 

Заранее спасибо!

ответ

4

Поскольку вы не хотите использовать какой-либо из указанных модулей (Tie :: IxHash и Tie :: Hash :: индексированных), а так как хэши unordered collections (как было сказано ранее), вы должны хранить это информация при вставке значения:

#!/usr/bin/perl 
use warnings; 
use strict; 

my %hash; 
my %index; #keep track of the insertion order 
my $i=0; 
for (["a","1"], ["b","2"], ["c","3"]) { #caveat: you can't insert values in your hash as you did before in one line 
    $index{$_->[0]}=$i++; 
    $hash{$_->[0]}=$_->[1]; 
} 

for (sort {$index{$a}<=>$index{$b}} keys %hash) { #caveat: you can't use while anymore since you need to sort 
    print "$_$hash{$_}\n"; 
} 

Это будет печатать:

a1 
b2 
c3 
5

Хеш не заказывается. Вам нужно выбрать другую структуру данных.

+0

не знаю, что это, спасибо. Нужно найти обходное решение тогда :) –

5

Вам нужно Tie::IxHash модуль для упорядоченных хэшей,

use Tie::IxHash; 

tie(my %hash, 'Tie::IxHash'); 
%hash = ("a", "1", "b", "2", "c", "3"); 

while (my ($key, $value) = each %hash) { 
    print "$key", "$value\n"; 
} 
5

Хэш обычно неупорядоченным. Вместо этого вы можете использовать упорядоченный хэш. Попробуйте Tie::Hash::Indexed от CPAN.

Из документации:

use Tie::Hash::Indexed; 

    tie my %hash, 'Tie::Hash::Indexed'; 

    %hash = (I => 1, n => 2, d => 3, e => 4); 
    $hash{x} = 5; 

    print keys %hash, "\n"; # prints 'Index' 
    print values %hash, "\n"; # prints '12345' 
+0

Это действительно работало, однако я стараюсь не включать модули. Должен найти другой способ сделать это. Спасибо за помощь, хотя :) –

8

Как печатать пары ключ/значение хэша, в порядке их появления в хэш.

Код, который вы использовали, делает именно это. c3, a1, b2 - порядок, в котором элементы появляются в hash в то время.

Что вы на самом деле хотите сделать, напечатав их в том порядке, в котором они были вставлены. Для этого вам нужно будет отслеживать порядок, в котором были вставлены элементы, или вам придется использовать что-то другое, кроме хеша, например, вышеупомянутые Tie::IxHash и Tie::Hash::Indexed.

+1

, который предпочитает сейчас? –

+3

@mpapec, у меня никогда не было необходимости. Я всегда был в состоянии справиться с массивом или массивом + хэш-комбо. – ikegami

Смежные вопросы

 Смежные вопросы