Getopts::Std patch for hash support
Stephen Zander [Mon, 18 Nov 1996 06:05:28 +0000 (18:05 +1200)]
lib/Getopt/Std.pm

index 4117ca7..fee0d33 100644 (file)
@@ -11,9 +11,12 @@ getopts - Process single-character switches with switch clustering
 =head1 SYNOPSIS
 
     use Getopt::Std;
-    getopt('oDI');  # -o, -D & -I take arg.  Sets opt_* as a side effect.
+
+    getopt('oDI');    # -o, -D & -I take arg.  Sets opt_* as a side effect.
+    getopt('oDI', \%opts);    # -o, -D & -I take arg.  Values in %opts
     getopts('oif:');  # -o & -i are boolean flags, -f takes an argument
                      # Sets opt_* as a side effect.
+    getopts('oif:', \%opts);  # options as above. Values in %opts
 
 =head1 DESCRIPTION
 
@@ -24,6 +27,11 @@ switch name) to the value of the argument, or 1 if no argument.  Switches
 which take an argument don't care whether there is a space between the
 switch and the argument.
 
+For those of you who don't like additional variables being created, getopt()
+and getopts() will also accept a hash reference as an optional second argument. 
+Hash keys will be x (where x is the switch name) with key values the value of
+the argument or 1 if no argument is specified.
+
 =cut
 
 @ISA = qw(Exporter);
@@ -40,8 +48,8 @@ switch and the argument.
 # Usage:
 #      getopt('oDI');  # -o, -D & -I take arg.  Sets opt_* as a side effect.
 
-sub getopt {
-    local($argumentative) = @_;
+sub getopt ($;$) {
+    local($argumentative, $hash) = @_;
     local($_,$first,$rest);
     local $Exporter::ExportLevel;
 
@@ -55,12 +63,22 @@ sub getopt {
                shift(@ARGV);
                $rest = shift(@ARGV);
            }
-           eval "\$opt_$first = \$rest;";
-           push( @EXPORT, "\$opt_$first" );
+          if (ref $hash) {
+              $$hash{$first} = $rest;
+          }
+          else {
+              eval "\$opt_$first = \$rest;";
+              push( @EXPORT, "\$opt_$first" );
+          }
        }
        else {
-           eval "\$opt_$first = 1;";
-           push( @EXPORT, "\$opt_$first" );
+          if (ref $hash) {
+              $$hash{$first} = 1;
+          }
+          else {
+              eval "\$opt_$first = 1;";
+              push( @EXPORT, "\$opt_$first" );
+          }
            if ($rest ne '') {
                $ARGV[0] = "-$rest";
            }
@@ -77,8 +95,8 @@ sub getopt {
 #   getopts('a:bc');   # -a takes arg. -b & -c not. Sets opt_* as a
 #                      #  side effect.
 
-sub getopts {
-    local($argumentative) = @_;
+sub getopts ($;$) {
+    local($argumentative, $hash) = @_;
     local(@args,$_,$first,$rest);
     local($errs) = 0;
     local $Exporter::ExportLevel;
@@ -94,12 +112,22 @@ sub getopts {
                    ++$errs unless @ARGV;
                    $rest = shift(@ARGV);
                }
-               eval "\$opt_$first = \$rest;";
-               push( @EXPORT, "\$opt_$first" );
+              if (ref $hash) {
+                  $$hash{$first} = $rest;
+              }
+              else {
+                  eval "\$opt_$first = \$rest;";
+                  push( @EXPORT, "\$opt_$first" );
+              }
            }
            else {
-               eval "\$opt_$first = 1";
-               push( @EXPORT, "\$opt_$first" );
+              if (ref $hash) {
+                  $$hash{$first} = 1;
+              }
+              else {
+                  eval "\$opt_$first = 1";
+                  push( @EXPORT, "\$opt_$first" );
+              }
                if($rest eq '') {
                    shift(@ARGV);
                }