This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Unicode::UCD: Fix blocks to work on early Unicodes
[perl5.git] / lib / Getopt / Std.pm
CommitLineData
a0d0e21e
LW
1package Getopt::Std;
2require 5.000;
3require Exporter;
4
f06db76b
AD
5=head1 NAME
6
c7bcd97d 7getopt, getopts - Process single-character switches with switch clustering
f06db76b
AD
8
9=head1 SYNOPSIS
10
11 use Getopt::Std;
0bc14741 12
12527e6c 13 getopt('oDI'); # -o, -D & -I take arg. Sets $opt_* as a side effect.
0bc14741 14 getopt('oDI', \%opts); # -o, -D & -I take arg. Values in %opts
f06db76b 15 getopts('oif:'); # -o & -i are boolean flags, -f takes an argument
12527e6c 16 # Sets $opt_* as a side effect.
0bc14741 17 getopts('oif:', \%opts); # options as above. Values in %opts
f06db76b
AD
18
19=head1 DESCRIPTION
20
12527e6c 21The getopt() function processes single-character switches with switch
f06db76b
AD
22clustering. Pass one argument which is a string containing all switches
23that take an argument. For each switch found, sets $opt_x (where x is the
1b946c1e
JH
24switch name) to the value of the argument if an argument is expected,
25or 1 otherwise. Switches which take an argument don't care whether
26there is a space between the switch and the argument.
f06db76b 27
12527e6c
RGS
28The getopts() function is similar, but you should pass to it the list of all
29switches to be recognized. If unspecified switches are found on the
30command-line, the user will be warned that an unknown option was given.
f4b3c303 31The getopts() function returns true unless an invalid option was found.
12527e6c 32
535b5725 33Note that, if your code is running under the recommended C<use strict
5812d790
GS
34'vars'> pragma, you will need to declare these package variables
35with "our":
535b5725 36
12527e6c 37 our($opt_x, $opt_y);
535b5725 38
5812d790 39For those of you who don't like additional global variables being created, getopt()
0bc14741
SZ
40and getopts() will also accept a hash reference as an optional second argument.
41Hash keys will be x (where x is the switch name) with key values the value of
42the argument or 1 if no argument is specified.
43
5812d790
GS
44To allow programs to process arguments that look like switches, but aren't,
45both functions will stop processing switches when they see the argument
46C<-->. The C<--> will be removed from @ARGV.
47
294d099e
IZ
48=head1 C<--help> and C<--version>
49
50If C<-> is not a recognized switch letter, getopts() supports arguments
51C<--help> and C<--version>. If C<main::HELP_MESSAGE()> and/or
52C<main::VERSION_MESSAGE()> are defined, they are called; the arguments are
53the output file handle, the name of option-processing package, its version,
54and the switches string. If the subroutines are not defined, an attempt is
55made to generate intelligent messages; for best results, define $main::VERSION.
56
669ecdbc
IZ
57If embedded documentation (in pod format, see L<perlpod>) is detected
58in the script, C<--help> will also show how to access the documentation.
59
294d099e
IZ
60Note that due to excessive paranoia, if $Getopt::Std::STANDARD_HELP_VERSION
61isn't true (the default is false), then the messages are printed on STDERR,
62and the processing continues after the messages are printed. This being
63the opposite of the standard-conforming behaviour, it is strongly recommended
64to set $Getopt::Std::STANDARD_HELP_VERSION to true.
65
66One can change the output file handle of the messages by setting
67$Getopt::Std::OUTPUT_HELP_VERSION. One can print the messages of C<--help>
68(without the C<Usage:> line) and C<--version> by calling functions help_mess()
69and version_mess() with the switches string as an argument.
70
f06db76b
AD
71=cut
72
a0d0e21e
LW
73@ISA = qw(Exporter);
74@EXPORT = qw(getopt getopts);
e3ec0a15 75$VERSION = '1.07';
294d099e
IZ
76# uncomment the next line to disable 1.03-backward compatibility paranoia
77# $STANDARD_HELP_VERSION = 1;
a0d0e21e
LW
78
79# Process single-character switches with switch clustering. Pass one argument
80# which is a string containing all switches that take an argument. For each
81# switch found, sets $opt_x (where x is the switch name) to the value of the
82# argument, or 1 if no argument. Switches which take an argument don't care
83# whether there is a space between the switch and the argument.
84
85# Usage:
86# getopt('oDI'); # -o, -D & -I take arg. Sets opt_* as a side effect.
87
12527e6c
RGS
88sub getopt (;$$) {
89 my ($argumentative, $hash) = @_;
90 $argumentative = '' if !defined $argumentative;
91 my ($first,$rest);
92 local $_;
6ca64377 93 local @EXPORT;
a0d0e21e
LW
94
95 while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
96 ($first,$rest) = ($1,$2);
5812d790
GS
97 if (/^--$/) { # early exit if --
98 shift @ARGV;
99 last;
100 }
a0d0e21e
LW
101 if (index($argumentative,$first) >= 0) {
102 if ($rest ne '') {
103 shift(@ARGV);
104 }
105 else {
106 shift(@ARGV);
107 $rest = shift(@ARGV);
108 }
5812d790
GS
109 if (ref $hash) {
110 $$hash{$first} = $rest;
111 }
112 else {
113 ${"opt_$first"} = $rest;
114 push( @EXPORT, "\$opt_$first" );
115 }
a0d0e21e
LW
116 }
117 else {
5812d790
GS
118 if (ref $hash) {
119 $$hash{$first} = 1;
120 }
121 else {
122 ${"opt_$first"} = 1;
123 push( @EXPORT, "\$opt_$first" );
124 }
a0d0e21e
LW
125 if ($rest ne '') {
126 $ARGV[0] = "-$rest";
127 }
128 else {
129 shift(@ARGV);
130 }
131 }
132 }
6ca64377
RB
133 unless (ref $hash) {
134 local $Exporter::ExportLevel = 1;
135 import Getopt::Std;
136 }
a0d0e21e
LW
137}
138
294d099e
IZ
139sub output_h () {
140 return $OUTPUT_HELP_VERSION if defined $OUTPUT_HELP_VERSION;
141 return \*STDOUT if $STANDARD_HELP_VERSION;
142 return \*STDERR;
143}
144
145sub try_exit () {
146 exit 0 if $STANDARD_HELP_VERSION;
147 my $p = __PACKAGE__;
148 print {output_h()} <<EOM;
149 [Now continuing due to backward compatibility and excessive paranoia.
1f874cb6 150 See 'perldoc $p' about \$$p\::STANDARD_HELP_VERSION.]
294d099e
IZ
151EOM
152}
153
154sub version_mess ($;$) {
155 my $args = shift;
156 my $h = output_h;
157 if (@_ and defined &main::VERSION_MESSAGE) {
158 main::VERSION_MESSAGE($h, __PACKAGE__, $VERSION, $args);
159 } else {
160 my $v = $main::VERSION;
161 $v = '[unknown]' unless defined $v;
162 my $myv = $VERSION;
163 $myv .= ' [paranoid]' unless $STANDARD_HELP_VERSION;
164 my $perlv = $];
165 $perlv = sprintf "%vd", $^V if $] >= 5.006;
166 print $h <<EOH;
167$0 version $v calling Getopt::Std::getopts (version $myv),
168running under Perl version $perlv.
169EOH
170 }
171}
172
173sub help_mess ($;$) {
174 my $args = shift;
175 my $h = output_h;
176 if (@_ and defined &main::HELP_MESSAGE) {
177 main::HELP_MESSAGE($h, __PACKAGE__, $VERSION, $args);
178 } else {
179 my (@witharg) = ($args =~ /(\S)\s*:/g);
180 my (@rest) = ($args =~ /([^\s:])(?!\s*:)/g);
181 my ($help, $arg) = ('', '');
182 if (@witharg) {
183 $help .= "\n\tWith arguments: -" . join " -", @witharg;
184 $arg = "\nSpace is not required between options and their arguments.";
185 }
186 if (@rest) {
187 $help .= "\n\tBoolean (without arguments): -" . join " -", @rest;
188 }
189 my ($scr) = ($0 =~ m,([^/\\]+)$,);
190 print $h <<EOH if @_; # Let the script override this
669ecdbc 191
294d099e
IZ
192Usage: $scr [-OPTIONS [-MORE_OPTIONS]] [--] [PROGRAM_ARG1 ...]
193EOH
194 print $h <<EOH;
669ecdbc 195
294d099e 196The following single-character options are accepted:$help
669ecdbc 197
294d099e
IZ
198Options may be merged together. -- stops processing of options.$arg
199EOH
669ecdbc
IZ
200 my $has_pod;
201 if ( defined $0 and $0 ne '-e' and -f $0 and -r $0
202 and open my $script, '<', $0 ) {
203 while (<$script>) {
204 $has_pod = 1, last if /^=(pod|head1)/;
205 }
206 }
207 print $h <<EOH if $has_pod;
208
209For more details run
210 perldoc -F $0
211EOH
294d099e
IZ
212 }
213}
214
a0d0e21e
LW
215# Usage:
216# getopts('a:bc'); # -a takes arg. -b & -c not. Sets opt_* as a
217# # side effect.
218
0bc14741 219sub getopts ($;$) {
12527e6c 220 my ($argumentative, $hash) = @_;
294d099e 221 my (@args,$first,$rest,$exit);
12527e6c
RGS
222 my $errs = 0;
223 local $_;
6ca64377 224 local @EXPORT;
a0d0e21e
LW
225
226 @args = split( / */, $argumentative );
294d099e 227 while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/s) {
a0d0e21e 228 ($first,$rest) = ($1,$2);
5812d790
GS
229 if (/^--$/) { # early exit if --
230 shift @ARGV;
231 last;
232 }
294d099e 233 my $pos = index($argumentative,$first);
5812d790
GS
234 if ($pos >= 0) {
235 if (defined($args[$pos+1]) and ($args[$pos+1] eq ':')) {
a0d0e21e 236 shift(@ARGV);
5812d790 237 if ($rest eq '') {
a0d0e21e
LW
238 ++$errs unless @ARGV;
239 $rest = shift(@ARGV);
240 }
5812d790
GS
241 if (ref $hash) {
242 $$hash{$first} = $rest;
243 }
244 else {
245 ${"opt_$first"} = $rest;
246 push( @EXPORT, "\$opt_$first" );
247 }
a0d0e21e
LW
248 }
249 else {
5812d790
GS
250 if (ref $hash) {
251 $$hash{$first} = 1;
252 }
253 else {
254 ${"opt_$first"} = 1;
255 push( @EXPORT, "\$opt_$first" );
256 }
257 if ($rest eq '') {
a0d0e21e
LW
258 shift(@ARGV);
259 }
260 else {
261 $ARGV[0] = "-$rest";
262 }
263 }
264 }
265 else {
294d099e
IZ
266 if ($first eq '-' and $rest eq 'help') {
267 version_mess($argumentative, 'main');
268 help_mess($argumentative, 'main');
269 try_exit();
270 shift(@ARGV);
271 next;
272 } elsif ($first eq '-' and $rest eq 'version') {
273 version_mess($argumentative, 'main');
274 try_exit();
275 shift(@ARGV);
276 next;
277 }
55118cb0 278 warn "Unknown option: $first\n";
a0d0e21e 279 ++$errs;
5812d790 280 if ($rest ne '') {
a0d0e21e
LW
281 $ARGV[0] = "-$rest";
282 }
283 else {
284 shift(@ARGV);
285 }
286 }
287 }
6ca64377
RB
288 unless (ref $hash) {
289 local $Exporter::ExportLevel = 1;
290 import Getopt::Std;
291 }
a0d0e21e
LW
292 $errs == 0;
293}
294
2951;