2016-01-05 2 views
-1

У меня есть массив хешей.Как напечатать хэш в определенном порядке в perl

Выход:

$VAR1 = { 
     'Name' => 'Bob', 
     'Address' => 'Home', 
     'DOB' => '01/01/1990', 
     'Sex' => 'M', 
    }; 
$VAR2 = { 
     'Name' => 'Mary', 
     'Address' => 'Home', 
     'DOB' => '01/01/1990', 
     'Sex' => 'F', 
    }; 

Что я печатаю в файл XML. Однако, когда я печатаю этот массив в файл XML, я получаю:

<Record Address=Home DOB=01/01/1990 Name=Bob Sex=M /> 

Id предпочитают иметь имя, адрес, DOB, секс.

<Record Name=Bob Address=Home Sex=M DOB=01/01/1990 /> 

Сортировка массива по значению ключа или ключа также не помещает значения в правильном порядке. Есть ли простое решение для печати хэша в нужном порядке?

+3

Пожалуйста, продемонстрируйте код, используемый для создания вывода. Вы можете отредактировать свой вопрос. Формат XML кажется немного странным, например, вам нужно использовать XML, но на самом деле этого не хотите. – simbabque

+0

Я бы просто сделал небольшую подпрограмму, которая печатает хэш так, как вы этого хотите, и назовите это по мере необходимости. – Doggerel

+0

Что вы используете для генерации XML? Если ответ «XML :: Simple», вы, вероятно, застряли. – Sobrique

ответ

6

Хеши explicitly unordered. Так что нет, вы не можете этого сделать. Там только два способа поддержания порядка (с hash):

  • использовать массив для обеспечения заказа с hash slice.
  • Используйте функцию сортировки, которая возвращает ключи в желаемом порядке.

Что-то вроде:

my @fields = qw ( Name Address DOB Sex); 
my @ordered_values = @hash{@fields}; 

или просто просто:

foreach my $key (@fields) { 
    print "$key=$hash{$key} "; 
} 

Хотя, если вы работаете с XML ... может быть есть более эффективные способы обработки вашего источника чем заполнять его в хэш в первую очередь.

Я хотел бы отметить - при написании XML, вы бы не обычно рядный ключевые ценности в содержании XML, а как атрибуты (или дочерние элементы):

<Record Address="Home" DOB="01/01/1990" Name="Bob" Sex="M" /> 

Или:

<Record> 
    <Address>Home</Address> 
    <DOB>01/01/1990</DOB> 
    <Name>Bob</Name> 
    <Sex>M</Sex> 
</Record> 

Поскольку при этом вы можете использовать инструменты XML-запросов для соответствия определенным критериям (например, xpath).

+0

Это должен быть принятый ответ, нет лучших альтернатив – Gang

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