in reply to Return values, Closure Vars from File::Find &wanted subs?

If you move the declaration of @dirlist outside the wanted sub, you will be pushing to the same array every time. Enclosing the variable declaration with the sub in a block limits the scope of @dirlist, creating a closure.
{ my @dirlist; sub wanted { return unless -d $_; push(@dirlist,$File::Find::name); return(@dirlist); } }
As xdg notes in reply, this is not the closure you actually want, though. Your wanted sub shouldn't be returning a list.

Caution: Contents may have been coded under pressure.

Replies are listed 'Best First'.
Re^2: Return values, Closure Vars from File::Find &wanted subs?
by xdg (Monsignor) on Nov 16, 2005 at 17:22 UTC

    That's really the same thing as just having the file be the enclosing scope. It would be different if this were for a subroutine that returned the list.

    sub get_dirlist { my $dir_to_scan = shift; my @dirlist; my $wanted = sub { return unless -d $_; push(@dirlist,$File::Find::name); } find( $wanted, $dir_to_scan ); return @dirlist; }

    The anonymous subroutine attached to $wanted is compiled only once, but gets a fresh copy of @dirlist for each invokation. Contrast that to this, which would continue to add to @dirlist each time the get_dirlist function was called and return a longer and longer array each time:

    my @dirlist; sub wanted { return unless -d $_; push(@dirlist,$File::Find::name); } sub get_dirlist { my $dir_to_scan = shift; find( \&wanted, $dir_to_scan ); return @dirlist; }

    -xdg

    Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.