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 %keymap;
$r{dump} = $dump;
}
return \%r;
});
####
#!/usr/bin/env perl
use 5.012;
use warnings;
use Data::Dump qw/dump dumpf/;
# Sort numbers 'zero' through 'nine'
my %num;
@num{qw} = 1..9;
my $data = {
two => { qw },
one => 'first',
three => 'third',
unknown => 'unknown key',
};
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 %keymap;
$r{dump} = $dump;
}
return \%r;
});
##
##
{
unknown => "unknown key",
one => "first",
two => {
one => "the",
six => "inner",
seven => "hash",
eight => "works",
nine => "too",
},
three => "third",
}