Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re^3: sortkeys for Data::Dump

by rjt (Deacon)
on Jul 22, 2013 at 02:30 UTC ( #1045562=note: print w/ replies, xml ) Need Help??


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.


Comment on Re^3: sortkeys for Data::Dump
Select or Download Code
Re^4: sortkeys for Data::Dump
by Anonymous Monk on Jul 22, 2013 at 03:17 UTC

    Have a little faith. :-)

    Eeeew talk about twisted hooks :)

    But that's what I ended up doing (recurse my own specific dumper) , easier to laser-focus that way

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1045562]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (11)
As of 2014-08-01 12:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Who would be the most fun to work for?















    Results (12 votes), past polls