How do you sort the output of Data::Dumper?

17,592

Solution 1

Set $Data::Dumper::Sortkeys = 1 to get Perl's default sort order. 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.

# 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);

Solution 2

Short answer for the impatient

Use Data::Dumper::Concise instead. 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.

Note that Data::Dumper::Concise is Data::Dumper with reasonable default configuration values set for you. Its equivalent to using Data::Dumper like this:

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);
}

Solution 3

You can set the $Data::Dumper::Sortkeys variable to a true value to get a default sort:

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.

Solution 4

sort ascii and full numeric:

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

Solution 5

For those who want to sort a hashref by value when printing it with Data::Dumper, here is an example:

$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 ];
};
Share:
17,592
qodeninja
Author by

qodeninja

I write qode mostly for myself... out of curiosity for solving problems, understanding how things work or making (sometimes unnecessarily) complex systems to only simplify them later (once I discover alternative strategies). For whatever reason, I like torturing myself with Regular Expressions, SED, Bash and JavaScript (Node), but have found a growing (painful) love with Python. Having said that, I enjoy scripting languages a lot more than compiled languages, and I've coded in almost all of the major modern ones except Ruby. I'm a secret Turing Machine/Computer Grammars/Regular Expressions nerd, and have written my own mini compilers and toy languages. I'm constantly writing command dispatchers that I later write scripting languages for; it's an addiction. There's plenty room for me to grow and learn still; and I appreciate the wisdom of grey beards and lady wizards even if I don't always follow their sage advice. FOSS is hella cool; cool projects are cool. Find me online if you have ideas. I'm a really bad programmer but I'll write a line or two for the betterization of the peoples. Edit: I recently discoved that VI is really just SED with wings. Still not using VI. Nano or bust.

Updated on June 19, 2022

Comments

  • qodeninja
    qodeninja almost 2 years

    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;
    
  • qodeninja
    qodeninja over 12 years
    this example is more clear than the other 2, i think other ppl looking for help with simple sorting will find ur answer the most useful!
  • mivk
    mivk over 10 years
    Nice for one-liners. But it's usually not installed by default. In Debian-based distributions, one can try sudo apt-get install libdata-dumper-concise-perl