简体   繁体   English

你如何对Data :: Dumper的输出进行排序?

[英]How do you sort the output of Data::Dumper?

I want to dump the values of my object and hash, but it keeps printing the keys out of order. 我想转储我的对象和散列的值,但它不按顺序打印键。 How can I dump the keys in (recursive) sort-order? 如何在(递归)排序顺序中转储密钥?

use Data::Dumper;
print Dumper $obj;

Set $Data::Dumper::Sortkeys = 1 to get Perl's default sort order. 设置$Data::Dumper::Sortkeys = 1以获取Perl的默认排序顺序。 If you want to customize the order, set $Data::Dumper::Sortkeys to a reference to a subroutine that receives a reference to a hash as input, and outputs a reference to the list of the hash's keys in the order you want them to appear. 如果要自定义顺序,请将$Data::Dumper::Sortkeys设置为对接收对散列的引用作为输入的子例程的引用,并按照您希望的顺序输出对散列键列表的引用出现。

# sort keys
$Data::Dumper::Sortkeys = 1;
print Dumper($obj);

# sort keys in reverse order - use either one
$Data::Dumper::Sortkeys = sub { [reverse sort keys %{$_[0]}] };
$Data::Dumper::Sortkeys = sub { [sort {$b cmp $a} keys %{$_[0]}] };
print Dumper($obj);

Short answer for the impatient 不耐烦的简短回答

Use Data::Dumper::Concise instead. 请改用Data :: Dumper :: Concise It sorts your keys. 它排序你的钥匙。 Use it like this: 像这样使用它:

use Data::Dumper::Concise;

my $pantsToWear = {
    pony       => 'jeans',
    unicorn    => 'corduroy',
    marsupials => {kangaroo => 'overalls', koala => 'shorts + suspenders'},
};

warn Dumper($pantsToWear);

More words for the curious 好奇的更多的话

Data::Dumper::Concise also gives you more compact, easier to read output. Data :: Dumper :: Concise还为您提供更紧凑,更易读的输出。

Note that Data::Dumper::Concise is Data::Dumper with reasonable default configuration values set for you. 请注意,Data :: Dumper :: Concise Data :: Dumper,为您设置了合理的默认配置值。 Its equivalent to using Data::Dumper like this: 它相当于像这样使用Data :: Dumper:

use Data::Dumper;
{
  local $Data::Dumper::Terse = 1;
  local $Data::Dumper::Indent = 1;
  local $Data::Dumper::Useqq = 1;
  local $Data::Dumper::Deparse = 1;
  local $Data::Dumper::Quotekeys = 0;
  local $Data::Dumper::Sortkeys = 1;
  warn Dumper($var);
}

From the Data::Dumper documentation: Data::Dumper文档:

$Data::Dumper::Sortkeys or $OBJ->Sortkeys([NEWVAL])
Can be set to a boolean value to control whether hash keys are dumped in sorted order. 
A true value will cause the keys of all hashes to be dumped in Perl's default sort order. 
Can also be set to a subroutine reference which will be called for each hash that is dumped. 
In  this case Data::Dumper will call the subroutine once for each hash, passing it the 
reference of the hash. The purpose of the subroutine is to return a reference to an array of 
the keys that will be dumped, in the order that they should be dumped. Using this feature, you 
can control both the order of the keys, and which keys are actually used. In other words, this 
subroutine acts as a filter by which you can exclude certain keys from being dumped. Default is  
0, which means that hash keys are not sorted.

You can set the $Data::Dumper::Sortkeys variable to a true value to get a default sort: 您可以将$Data::Dumper::Sortkeys变量设置为true值以获取默认排序:

use Data::Dumper;
$Data::Dumper::Sortkeys  = 1;

my $hashref = {
    bob => 'weir',
    jerry =>, 'garcia',
    nested => {one => 'two', three => 'four'}};

print Dumper($hashref), "\n";

or put a subroutine in there to sort the keys however you want. 或者在那里放一个子程序,按照你想要的方式对键进行排序。

For those who want to sort a hashref by value when printing it with Data::Dumper , here is an example: 对于那些想要使用Data::Dumper打印时按值对hashref进行排序的人 ,这是一个例子:

$Data::Dumper::Sortkeys = sub {
    # Using <=> to sort numeric values
    [ sort { $_[0]->{$a} <=> $_[0]->{$b} } keys %{ $_[0] } ]
};

And here is a more readable alternative, doing the same but with a variable to hold the hash. 这是一个更具可读性的替代方案,做同样的事情,但有一个变量来保存哈希值。 It's less efficient, but for small hashes, some may find it nicer: 效率较低,但对于小哈希,有些人可能会发现它更好:

$Data::Dumper::Sortkeys = sub {
    my %h = %{$_[0]};
    # cmp for string comparisons
    [ sort { $h{$a} cmp $h{$b} } keys %h ];
};

sort ascii and full numeric: 排序ascii和完整数字:

$Data::Dumper::Sortkeys = sub {
  no warnings 'numeric';
  if(join('',keys %{$_[0]})=~/\d+/)
  {
    [ sort { $a <=> $b } keys %{$_[0]} ]
  }
  else
  {
    return [sort(keys %{$_[0]})];
  }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM