in reply to Confused scoping while using File::Find

Turning on warnings with "use warnings;" or -w would have given you a Variable will not stay shared warning; saying "use diagnostics" would have produced:
Variable "$file_name" will not stay shared at FileMan.pm line 15 (#1)
(W closure) An inner (nested) named subroutine is referencing a lexical variable defined in an outer subroutine.

When the inner subroutine is called, it will probably see the value of the outer subroutine's variable as it was before and during the *first* call to the outer subroutine; in this case, after the first call to the outer subroutine is complete, the inner and outer subroutines will no longer share a common value for the variable. In other words, the variable will no longer be shared.

Furthermore, if the outer subroutine is anonymous and references a lexical variable outside itself, then the outer and inner subroutines will never share the given variable.

This problem can usually be solved by making the inner subroutine anonymous, using the sub {} syntax. When inner anonymous subs that reference variables in outer subroutines are called or referenced, they are automatically rebound to the current values of such variables.

Variable "@a_files" will not stay shared at FileMan.pm line 15 (#1)

Following that recommendation, make your code something like (untested):
#- The Subroutine To Process Files And Directories my $process_file = sub { if ($_ eq $file_name){push (@a_files, $File::Find::name);}} # Search file_path for the file find($process_file, $file_path);

Replies are listed 'Best First'.
Re^2: Confused scoping while using File::Find
by rongoral (Beadle) on Oct 11, 2004 at 15:08 UTC
    THANK YOU!!!! This is the answer. Holy Cow!! =) This has been several days of endless frustration. You are indeed a wise one and I bow to your superior knowledge. Thank You.

      It is quite usual for a new comer to the Perl world being confused by closure, so don't be too frustrated ;-)

      Closure is something nice to know, so you can recognize it next time. But in general, you should avoid it, as it breaks your lexical scope. You want to code in a clear way, not a confusing way ;-) I guess you learned more than just closure, if you think about it more.

        Indeed, I have learned a lesson. A cool one though. I was not sure what a closure was. It is kind of a difficult concept. However, I now see why my variable maintained its value even after the surrounding function had returned and the scope was lost.

        I am grateful for the knowledge passed along.