in reply to Help to understand the Data::TreeDumper Filters

return( 'SCALAR', undef, $_{'node'} );

I have no experience with Data::TreeDumper filters, but this $_{'node'} looks very strange.  What is this meant to be?

Also, the docs say "The filter returns the node's type, an eventual new structure (see below) and a list of 'keys' to display. The keys are hash keys or array indexes.".  In other words, as long as you return "keys-to-display", it doesn't seem to make sense to have 'SCALAR' as type (as you can apply neither keys nor indices).

I wonder if

return( 'HASH', undef, 'node' );

would be closer to what you want... (presuming 'node' is the key you want to display)

Replies are listed 'Best First'.
Re^2: Help to understand the Data::TreeDumper Filters
by Dirk80 (Pilgrim) on Apr 13, 2011 at 08:51 UTC

    Sorry for my long post. I now summarized my real problem in a small example.

    #!/usr/bin/perl use strict; use warnings; use Data::TreeDumper; my $s = {'name' => 'Homer', 'surname' => 'Simpson', 'kids' => [ { 'name' => 'Bart', 'surname' => 'Simpson' }, { 'name' => 'Lisa', 'surname' => 'Simpson' }, { 'name' => 'Maggie', 'surname' => 'Simpson' }], 'wife' => { 'name' => 'Marge', 'surname' => 'Simpson' }}; my $OnlyName = sub { my $s = shift ; if('HASH' eq ref $s) { # TODO return('HASH', undef, grep { /^name$/} keys %$s) ; } return(Data::TreeDumper::DefaultNodesToDisplay($s)) ; }; print DumpTree($s, 'The Simpsons', DISPLAY_ADDRESS => 0, FILTER => $OnlyName) ; ############################################################ # UNFILTERED OUTPUT ############################################################ #The Simpsons #|- kids #| |- 0 #| | |- name = Bart #| | `- surname = Simpson #| |- 1 #| | |- name = Lisa #| | `- surname = Simpson #| `- 2 #| |- name = Maggie #| `- surname = Simpson #|- name = Homer #|- surname = Simpson #`- wife # |- name = Marge # `- surname = Simpson ############################################################ # FILTERED OUTPUT (only name) ############################################################ #The Simpsons #|- kids #| |- 0 #| | |- name = Bart #| |- 1 #| | |- name = Lisa #| `- 2 #| |- name = Maggie #|- name = Homer #`- wife # |- name = Marge

    I have a hash. I want to print it with Data::TreeDumper. My goal is it to only print the keys of the hash which are called "name". (see FILTERED OUTPUT (only name)).

    How do I have to write the filter? My suggestion was

    return('HASH', undef, grep { /^name$/} keys %$s) ;
    but this is NOT working.

    Thank you for your help.

      but this is NOT working.

      It's always a good idea to mention how exactly it doesn't work — that way you enhance your chances of getting a useful reply, because not everyone is willing to install non-standard modules (+ dependencies) just to figure out what you could have mentioned right away. And often, an educated guess can be made without having the module installed, as long you have all relevant info available.  But thanks for following up with self-contained sample code.

      That said, I did install the module to confirm my suspicion that the not-working output is

      The Simpsons `- name = Homer

      Reason is that if you only let 'name' pass through the filter, DumpTree won't recurse into the other entries 'kids' and 'wife'... In other words, in this particular case, you could do:

      return('HASH', undef, grep { !/^surname$/} keys %$s) ;

      Output:

      The Simpsons |- wife | `- name = Marge |- name = Homer `- kids |- 0 | `- name = Bart |- 1 | `- name = Lisa `- 2 `- name = Maggie

        Thank you a lot. Now I finally understand it. My problem was always that I did not take the container elements (in this example "wife" and "kids") into account. So DumpTree did not recurse.

        The same solution with positive logic would then be:

        return('HASH', undef, grep { /^name|kids|wife$/} keys %$s) ;

        And of course you are right. I should describe what exactly did not work if I use a non-standard module.