Provided by: libdata-walk-perl_1.00-2_all bug

NAME

       Data::Walk - Traverse Perl data structures

SYNOPSIS

        use Data::Walk;
        walk \&wanted, @items_to_walk;

        use Data::Walk;
        walkdepth \&wanted, @items_to_walk;

        use Data::Walk;
        walk { wanted => \&process, follow => 1 }, $self;

DESCRIPTION

       The above synopsis bears an amazing similarity to File::Find(3pm) and this is not coincidental.

       Data::Walk(3pm) is for data what File::Find(3pm) is for files.  You can use it for rolling your own
       serialization class, for displaying Perl data structures, for deep copying or comparing, for recursive
       deletion of data, or ...

       If you are impatient and already familiar with File::Find(3pm), you can skip the following documentation
       and proceed with "DIFFERENCES TO FILE::FIND".

FUNCTIONS

       The module exports two functions by default:

       walk
             walk \&wanted, @items;
             walk \%options, @items;

           As the name suggests, the function traverses the items in the order they are given.  For every object
           visited, it calls the &wanted subroutine.  See "THE WANTED FUNCTION" for details.

       walkdepth
             walkdepth \&wanted, @items;
             walkdepth \%options, @items;

           Works  exactly  like  "walk()"  but  it first descends deeper into the structure, before visiting the
           nodes on the current level.  If you want to delete visited nodes, then "walkdepth()" is probably your
           friend.

OPTIONS

       The first argument to "walk()" and "walkdepth()" is either a code reference to your &wanted function,  or
       a hash reference describing the operations to be performed for each visited node.

       Here are the possible keys for the hash.

       wanted
           The  value  should  be  a  code reference.  This code reference is described in "THE WANTED FUNCTION"
           below.

       bydepth
           Visits nodes on the current level of recursion only after descending into subnotes.  The entry  point
           "walkdepth()" is a shortcut for specifying "{ bydepth => 1 }".

       preprocess
           The  value  should  be  a code reference.  This code reference is used to preprocess the current node
           $Data::Walk::container.  Your preprocessing function  is  called  before  the  loop  that  calls  the
           "wanted()" function.  It is called with a list of member nodes and is expected to return such a list.
           The  list  will  contain  all  sub-nodes,  regardless of the value of the option follow!  The list is
           normally a shallow copy of the data contained in the original structure.  You  can  therefore  safely
           delete items in it, without affecting the original data.  You can use the option copy, if you want to
           change that behavior.

           The  behavior  is  identical  for  regular arrays and hashes, so you probably want to coerce the list
           passed as an argument into a hash then.  The  variable  $Data::Walk::type  will  contain  the  string
           "HASH" if the currently inspected node is a hash.

           You  can  use the preprocessing function to sort the items contained or to filter out unwanted items.
           The order is also preserved for hashes!

       preprocess_hash
           The value should be a code reference.  The code is executed right after an  eventual  preprocess_hash
           handler, but only if the current container is a hash.  It is skipped for regular arrays.

           You  will usually prefer a preprocess_hash handler over a preprocess handler if you only want to sort
           hash keys.

       postprocess
           The value should be a code reference.  It is invoked just before leaving the currently visited  node.
           It  is  called  in void context with no arguments.  The variable $Data::Walk::container points to the
           currently visited node.

       follow
           Causes cyclic references to be followed.  Normally, the traversal will not descend  into  nodes  that
           have  already  been  visited.   If  you  set  the option follow to a truth value, you can change this
           behavior.  Unless you take additional measures, this will always imply an infinite loop!

           Please note that the &wanted function is also called for nodes that have already been  visited!   The
           effect of follow is to suppress descending into subnodes.

       copy
           Normally,  the &preprocess function is called with a shallow copy of the data.  If you set the option
           copy to a false value, the &preprocess function is called with one single argument,  a  reference  to
           the original data structure.  In that case, you also have to return a suitable reference.

           Using  this  option  will  result  in  a  slight performance win, and can make it sometimes easier to
           manipulate the original data.

           What is a shallow copy?  Think of a list containing references to hashes:

               my @list = ({ foo => 'bar' }, { foo => 'baz' });
               my @shallow = @list;

           After this, @shallow will contain a new list, but the items stored in it are exactly identical to the
           ones stored in the original.  In other words,  @shallow  occupies  new  memory,  whereas  both  lists
           contain references to the same memory for the list members.

       All other options are silently ignored.

THE WANTED FUNCTION

       The  &wanted function does whatever verifications you want on each item in the data structure.  Note that
       despite its name, the &wanted function is a generic callback and does not tell Data::Walk(3pm) if an item
       is "wanted" or not.  In fact, its return value is ignored.

       The wanted function takes no arguments but rather does its work through a collection of variables:

       $_  The currently visited node.  Think "file" in terms of File::Find(3pm)!

       $Data::Walk::container
           The node containing the currently visited node, either a reference to a  hash  or  an  array.   Think
           "directory" in terms of File::Find(3pm)!

       $Data::Walk::type
           The  base  type  of  the  object  that  $Data::Walk::container references.  This is either "ARRAY" or
           "HASH".

       $Data::Walk::seen
           For  references, this will hold the number of times the  currently  visited  node  has  been  visited
           before.   The value is consequently set to 0 not 1 on the first visit.  For non-references, the value
           is undefined.

       $Data::Walk::address
           For references, this will hold the memory address  it  points  to.   It  can  be  used  as  a  unique
           identifier for the current node.  For non- references, the value is undefined.

       $Data::Walk::depth
           The depth of the current recursion.

       These variables should not be modified.

DIFFERENCES TO FILE::FIND

       The  API  of  Data::Walk(3pm)  tries to mimic the API of File::Find(3pm) to a certain extent.  If you are
       already familiar with File::Find(3pm) you will find it  very  easy  to  use  Data::Walk(3pm).   Even  the
       documentation for Data::Walk(3pm) is in parts similar or identcal to that of File::Find(3pm).

   Analogies
       The  equivalent  of  directories  in  File::Find(3pm)  are  the  container data types in Data::Walk(3pm).
       Container data types are arrays (aka lists) and associative arrays (aka hashes).  Files are equivalent to
       scalars.  Wherever File::Find(3pm) passes lists of strings to functions, Data::Walk(3pm) passes lists  of
       variables.

   Function Names
       Instead  of  "find()"  and "finddepth()", Data::Walk(3pm) uses "walk()" and "walkdepth()", like the smart
       reader has already guessed after reading the "SYNOPSIS".

   Variables
       The variable $Data::Walk::container is vaguely equivalent to $File::Find::dir.  All other  variables  are
       specific to the corresponding module.

   Wanted Function
       Like  its archetype from File::Find(3pm), the wanted function of Data::Walk(3pm) is called with $_ set to
       the currently inspected item.

   Options
       The option follow has the effect that Data::Walk(3pm) also descends into nodes it  has  already  visited.
       Unless you take extra measures, this will lead to an infinite loop!

       A  number  of options are not applicable to data traversion and are ignored by Data::Walk(3pm).  Examples
       are follow_fast, follow_skip, no_chdir, untaint, untaint_pattern, and untaint_skip.  To  give  truth  the
       honor, all unrecognized options are skipped.

       You  may  argue,  that  the options untaint and friends would be useful, too, allowing you to recursively
       untaint data structures.  But, hey, that is what Data::Walk(3pm) is all about.  It makes it very easy for
       you to write that yourself.

EXAMPLES

       Following are some recipies for common tasks.

   Recursive Untainting
           sub untaint {
               s/(.*)/$1/s unless ref $_;
           };
           walk \&untaint, $data;

       See perlsec(1), if you don't understand why the untaint() function untaints your data here.

   Recurse To Maximum Depth
       If you want to stop the recursion at a certain level, do it as follows:

           my $max_depth = 20;
           sub not_too_deep {
               if ($Data::Walk::depth > $max_depth) {
                   return ();
               } else {
                   return @_;
               }
           }
           sub do_something1 {
               # Your code goes here.
           }
           walk { wanted => \&do_something, preprocess => \&not_too_deep };

BUGS

       If you think you have spotted a bug, you can  share  it  with  others  in  the  bug  tracking  system  at
       http://rt.cpan.org/NoAuth/Bugs.html?Dist=Data-Walk.

COPYING

       Copyright (C) 2005-2006, Guido Flohr <guido@imperia.net>, all rights reserved.

       This  program  is  free  software;  you  can  redistribute it and/or modify it under the terms of the GNU
       Library General Public License as published by the Free Software Foundation; either  version  2,  or  (at
       your option) any later version.

       This  program  is  distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
       the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General
       Public License for more details.

       You should have received a copy of the GNU Library General Public License along  with  this  program;  if
       not,  write  to  the  Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
       USA.

SEE ALSO

       Data::Dumper(3pm), Storable(3pm), File::Find(3pm), perl(1)

perl v5.18.1                                       2013-12-26                                    Data::Walk(3pm)