in reply to use strict with Getopt::Std

This is a fairly common encounter for newer Perl programmers. As the previous reply points out, you can get around the scoping issues by using the vars pragma (or the our declaration in place of my).

My suggestion is to avoid individual variables for the options completely. I never use the implicitly-sets-variable form of Getopts::Std or Getopts::Long. Instead, I always declare a hash table for the options (generally under a creative name like "%opts") and pass it by reference as the second parameter to the getopts call:

getopts("J:f:s:", \%opts) or die "error message...";

This has several advantages: You still have a lexical variable, you're passing in an explicit reference to it which avoids the scoping problems; You can also add more options to your command-line logic without worrying about declaring new variables, and you can remove options without leaving declared-but-unused variables laying around.

--rjray

Replies are listed 'Best First'.
Re: Re: use strict with Getopt::Std
by particle (Vicar) on Mar 20, 2003 at 13:36 UTC

    still, for cutter to get this to work with strict, %opts will need to be declared first.

    something like:

    my %opts; getopts( "J:f:s:", \%opts ) or die "error message..."; ## --or, all in one (shorter but not as clear)-- getopts( "J:f:s:", \my %opts ) or die "...";

    will have all the advantages you mentioned, and be strict compliant.

    ~Particle *accelerates*

      My apologies-- I assumed that the need for declaring %opts would be obvious. However, that might have confused some of the newer Perl programmers. You are quite right about declaring it, of course.

      --rjray

Re^2: use strict with Getopt::Std
by Anonymous Monk on Mar 27, 2015 at 18:26 UTC
    One thing to note is that if you pre-define individual variables, you need to use "our" rather than "my":
    use strict; use Getopt::Std; our($opt_a, $opt_b); getopts('ab');
    Mike