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

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.

Replies are listed 'Best First'.
Re^3: Help to understand the Data::TreeDumper Filters
by Eliya (Vicar) on Apr 13, 2011 at 09:57 UTC
    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.