in reply to Better way to use File::Find and Archive::Tar

Variable "$tar" will not stay shared at web_admin.pl line 394.
Well, perldiag says this:
(W) 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.
And if you don't want to process all that, the simplest explanation is that Perl isn't Pascal, and doesn't really support "nested subroutines", so stop doing that.

-- Randal L. Schwartz, Perl hacker

Replies are listed 'Best First'.
Re: Re: Better way to use File::Find and Archive::Tar
by brendonc (Novice) on Mar 17, 2001 at 00:48 UTC
    I do realize that this is messy but I haven't really been able to find a better way.
      Better way #1:
      sub del_web() { ... my $tar = Archive::Tar->new(); $tar->read("$web_to_del.tar.gz",1); find(\&archive($tar), "$web_base/$web_to_del"); $tar->write("$defunct_dir/$web_to_del.tar.gz",1); ... } sub archive { my $tar = shift; $tar->add_files($File::Find::name); }
      Better way #2:
      sub del_web() { ... my $tar = Archive::Tar->new(); $tar->read("$web_to_del.tar.gz",1); find(sub {$tar->add_files($File::Find::name)}, "$web_base/$web_to_de +l"); $tar->write("$defunct_dir/$web_to_del.tar.gz",1); ... }
      I also took the liberty of fixing the "my" statements to be in scalar context like they belong.

      buckaduck