in reply to Re^2: sortkeys for Data::Dump
in thread sortkeys for Data::Dump
... 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
#!/usr/bin/env perl use 5.012; use warnings; use Data::Dump qw/dump dumpf/; # Sort numbers 'zero' through 'nine' my %num; @num{qw<one two three four five six seven eight nine>} = 1..9; my $data = { two => { qw<six inner eight works one the nine too seven hash> + }, 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 %keym +ap; $r{dump} = $dump; } return \%r; });
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: sortkeys for Data::Dump
by Anonymous Monk on Jul 22, 2013 at 03:17 UTC |