in reply to Re^3: Program unsuspectingly dies with no reason why.
in thread Program unsuspectingly dies with no reason why. -FIXED!

Well so far, even after passing those elements to the subprocess call "&clean_the_file();" I still had no luck. Albeit, I did remember reading about subprocess' being named with funky underscores causing issues with Perl awhile back. This may not be the case, but I removed the name of the sub() function renamed it to cleanthefile();.

I commented everything out and just printed my variables $sourcefile and $removeq, $sourcefile prints the directory name as expected, BUT - $removeq spits this output out
[root@oailxpp02 ccsys]# /root/mkpq -r queue-04 Global symbol "$removeq" requires explicit package name at /root/mkpq +line 87. Execution of /root/mkpq aborted due to compilation errors.

My guess is: the scalar isn't being handled properly, the subprocess can't bring it into it's set of instructions, am I on the right track? Does anyone have any recommendations?

Replies are listed 'Best First'.
Re^5: Program unsuspectingly dies with no reason why.
by kyle (Abbot) on Feb 14, 2008 at 18:59 UTC

    The error "Global symbol "$removeq" requires explicit package name" is what you get (under strict) when you try to use a variable named $removeq without declaring it with my. In the code you posted originally, there is a my declaration for $removeq, so I don't know why you'd be getting this error now. I'd need to know what else is changed. Maybe you could post an updated copy of the code you're using.

      Updated code
      if ($remove) { $remove = lc($remove); my %remove_cmd = ( remove => "rmquedev -d $remove -q $remove" ); print "Are you sure you want to remove print queue \"$remove\" [Y/ +n]?"; $_ = <>; chomp($_); $_ = "Y" if ( length($_) == 0 ); if ( $_ =~ /[Yy]/ ) { # Wait for user-input system( $remove_cmd {'remove'} ); print "Prepairing to remove \"$remove\" from the CC_print.printers file.\n"; sleep 2; my $removeq = $remove; &cleanthefile($removeq); } else { die "You chose NOT to remove queue \"$remove\"\n"; } }

      Sub-Process
      sub cleanthefile { my $sourcefile = "/u/ccsys/CC_print.printers"; print $removeq; print "$sourcefile\n"; # Keep a dedicated backup of CC_print.printers if ( -t ne "/root/CC_print.printers.bkp" ) { system("touch /root/CC_print.printers.bkp"); sleep 2; system("cp -R $sourcefile /root/CC_print.printer.bkp"); } if ( -t eq "/root/CC_print.printers.bkp" ) { system("cp -R $sourcefile /root/CC_print.printer.bkp"); # grab the sourcefile and the string to remove as the first and second + arguments my ( $sourcefile, $removeq )= @_; my $tempfile = "/u/ccsys/CC_print.printers.bkp_mkpq"; # create a temporary file if (-e ne "$tempfile") { system("touch /u/ccsys/CC_print.printers.bkp_mkpq"); } # extract lines from $sourcefile which do NOT have the string to + remove # note that the \' inserts ticks so that strings with spaces can + work, too if ( -t "$tempfile") { #system ("cat $sourcefile \| grep -v $removeq $sourcefile > $t +empfile"); #`grep -v $removeq $sourcefile /dev/null /dev/null > $tempfile +`; sleep 1; print "Waiting to unlink..\n"; # delete source file, then rename working file unlink($sourcefile); rename( $tempfile, $sourcefile ); system("rm -rf $tempfile"); } } }

      I placed a print statment for $removeq to me it seems as if $removeq is not being passed correctly. I'm rather new to Perl, I wouldn't doubt this is just product of my inexperience with programming in general. No matter how much I read I can't seem to find a solution to this issue!

        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.