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. |