When you call a sub with parameters, those parameters arrive at the sub in the special array, @_. The usual practice is to copy the elements of that array immediately upon entering the sub.
sub foo { my ( $x, $y ) = @_; # ... }
Sometimes that's done this way:
sub foo { my $x = shift; my $y = shift; # ... }
In that case, rather than just copying, shift is actually pulling items off the array (which are then copied).
In each of these, you can call foo( 'hello', 'world' ), and $x will take the value 'hello' while $y takes the value 'world'. If you call foo( $howdy, $doody ), the variables $howdy and $doody won't be visible inside foo, but their values will be in $x and $y.
In your particular case, you're trying to print $removeq immediately upon entering the sub without grabbing the arguments first. The cleanthefile sub doesn't see the $removeq of the caller directly. It just gets a copy via the @_ array. (The fact that it doesn't have a variable by that name is what the "Global symbol "$removeq" requires explicit package name" error is about.)
It actually does take a copy later, on this line:
my ( $sourcefile, $removeq )= @_;
...but you're trying to print before that.
What I'd recommend, to start, is to get rid of that line, and put this at the very start of the sub:
my ( $removeq ) = @_;
At that point, I think the problem you may have is that $sourcefile doesn't have a value. I don't see where that value might come from, so I don't know how to advise you on how to fix that.
If you're interested in the gory details of sub calls in Perl, see perlsub.
In reply to Re^7: Program unsuspectingly dies with no reason why.
by kyle
in thread Program unsuspectingly dies with no reason why. -FIXED!
by misconfiguration
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |