http://www.perlmonks.org?node_id=1045545

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

anyone seen a sortkeys (like Data::Dumper->new->Sortkeys() ) for Data::Dump?

Replies are listed 'Best First'.
Re: sortkeys for Data::Dump
by rjt (Curate) on Jul 22, 2013 at 00:04 UTC

    There is no analogous method, because Data::Dump sorts the keys by default. (Confirmed by inspection of Data/Dump.pm.)

    #!/usr/bin/env perl use 5.012; use warnings; use Data::Dump qw/dump/; my $data = { key1 => 'foo', key2 => 3, key0 => 'bar', }; dump $data;

    Output:

    { key0 => "bar", key1 => "foo", key2 => 3 }

    If you need to customize the sort subroutine, however, you will need to hook into Data::Dump::Filtered. You did not specify which usage you need, but you supplied empty arguments to Sortkeys() in your OP, so I'll assume the former for now.

      ...

      Thanks, I know :)

      ... hook ...

      I don't think so, I think a patch is in order, but I give up

        ... hook ...

        I don't think so

        Have a little faith. :-)

        Easily extendable to support arbitrary sort subs, or even context-sensitive sorts.

        my $dump = dumpf($data, sub { use List::Util qw/max/; my ($ctx, $obj) = @_; my %r; state %seen; if ('HASH' eq ref $obj and not $seen{$obj}++) { no warnings 'uninitialized'; # Unknown sort keys my $len = max map { length } keys $obj; # Keep results aligned my $sort_string = 'a' x max map { length } keys $obj; # Convert existing keys to ...aaaaa, ...aaaab, ...aaaac, etc., # so Data::Dump's lexical sort works. my %keymap = map { $sort_string++ => $_ } sort { $num{$a} <=> $num{$b} } keys $obj; $obj->{$_} = delete $obj->{$keymap{$_}} for keys %keymap; my $dump = Data::Dump::dump($obj); # Replace to get original keys back $dump =~ s/$_/sprintf "%-${len}s",$keymap{$_}/e for keys %keym +ap; $r{dump} = $dump; } return \%r; });

        Full example

        Output:

        { unknown => "unknown key", one => "first", two => { one => "the", six => "inner", seven => "hash", eight => "works", nine => "too", }, three => "third", }

        I think a patch is in order,

        Not a bad idea, either.