如何在perl中以特定顺序打印哈希

Joh*_*ohn -1 printing perl hash

我有一系列哈希.

输出:

$VAR1 = {
      'Name' => 'Bob',
      'Address' => 'Home',
      'DOB' => '01/01/1990',
      'Sex' => 'M',
    };
$VAR2 = {
      'Name' => 'Mary',
      'Address' => 'Home',
      'DOB' => '01/01/1990',
      'Sex' => 'F',
    };
Run Code Online (Sandbox Code Playgroud)

我打印到xml文件.但是,当我将此数组打印到xml文件时,我得到:

<Record Address=Home DOB=01/01/1990 Name=Bob Sex=M />
Run Code Online (Sandbox Code Playgroud)

我喜欢有姓名,地址,DOB,性别.

<Record Name=Bob Address=Home Sex=M DOB=01/01/1990 />
Run Code Online (Sandbox Code Playgroud)

按键或键值对数组进行排序也不会使值按正确的顺序排列.是否有一个简单的解决方案以所需的顺序打印哈希?

Sob*_*que 6

哈希明确无序.所以不,你做不到.维持秩序只有两种方式(a hash):

  • 使用数组来强制使用哈希切片进行排序.
  • 使用按所需顺序返回键的排序功能.

就像是:

my @fields = qw (  Name Address DOB Sex );
my @ordered_values = @hash{@fields}; 
Run Code Online (Sandbox Code Playgroud)

或者只是一个简单的:

foreach my $key ( @fields ) {
    print "$key=$hash{$key} "; 
}
Run Code Online (Sandbox Code Playgroud)

虽然,如果您正在使用XML ...可能有更好的方法来处理源数据,而不是首先将其填充到哈希中.

我会注意到 - 在编写XML时,通常不会在XML的内容中内联键值,而是作为属性(或子元素):

<Record Address="Home" DOB="01/01/1990" Name="Bob" Sex="M" />
Run Code Online (Sandbox Code Playgroud)

要么:

<Record>
   <Address>Home</Address> 
   <DOB>01/01/1990</DOB>
   <Name>Bob</Name>
   <Sex>M</Sex>
</Record>
Run Code Online (Sandbox Code Playgroud)

因为通过这样做,您可以使用XML查询工具来匹配特定条件(如xpath).