rayh has asked for the wisdom of the Perl Monks concerning the following question:

Quick one here. If called as script.pl -s, why doesn't this print "-s"?
#!/usr/bin/perl if ($ARGV[0] eq '-s') { my $argument = shift @ARGV; } print "$argument";
I know the comparison is true but the shift doesn't seem happy. If I type "print shift @ARGV", I can see the -s. However it doesn't want to be assigned to a variable.

Replies are listed 'Best First'.
Re: shift @ARGV not working
by toolic (Bishop) on May 09, 2013 at 18:44 UTC
      Derp. Duh. I was getting a little too fancy in a larger script and overlooked the use of "my" in a new block. Thanks!
Re: shift @ARGV not working
by blue_cowdawg (Monsignor) on May 09, 2013 at 18:47 UTC

    #!/usr/bin/perl -w use strict; foreach my $i(0..$#ARGV){ printf "\$ARGV[%d] = \"%s\"\n",$i,$ARGV[$i]; } while(my $arg=shift @ARGV){ printf "%s\n",$arg; } # # -------------- 8< snip! 8<------------- $ ./shifty.pl a b c d e f g $ARGV[0] = "a" $ARGV[1] = "b" $ARGV[2] = "c" $ARGV[3] = "d" $ARGV[4] = "e" $ARGV[5] = "f" $ARGV[6] = "g" a b c d e f g
    I think the issue you are a having is you didn't shift prior to setting $argument.


    Peter L. Berghold -- Unix Professional
    Peter -at- Berghold -dot- Net; AOL IM redcowdawg Yahoo IM: blue_cowdawg

      Howdy blue_cowdawg,
      How could you miss that? The issue he was having is variable scope issue. How does the OP think he would be able to print the variable, when it was scoped to the if block?
      Moreover, if the OP has used strict and warnings, he would have seen the red gauge
      I think you need a break from the keyboard. You are working to hard...

        Also, the OP did "shift before setting $argument", because the assignment is processed from right to left.