-s: Not Just For File Sizes!

pudge on 2007-02-07T21:19:53

So apparently a lot of people do not know about -s. Not the file test for size, but the command-line switch. From the docs:

< blockquote >-s enables rudimentary switch parsing for switches on the command line after the program name but before any filename arguments (or before an argument of --). This means you can have switches with two leading dashes (--help). Any switch found there is removed from @ARGV and sets the corresponding variable in the Perl program. The following program prints "1" if the program is invoked with a -xyz switch, and "abc" if it is invoked with -xyz=abc.

#!/usr/bin/perl -s if ($xyz) { print "$xyz\n" }

Do note that --help creates the variable ${-help}, which is not compliant with "strict refs".

I use this a lot. A good 20 or so of the scripts I keep in my private bin directory have it, and I use it fairly often for one-offs too. Here's an example, from my bbeditp script:

#!/usr/bin/perl -s
our $g;
my $prog = $g ? 'gluedoc' : 'perldoc';
my $doc = shift;
open STDOUT, "|bbedit --view-top --clean -t $doc";
system $prog, '-t', $doc;


If I call bbeditp Finder, it looks for a perl module named "Finder", and opens it as an text window in BBEdit. If I call bbeditp -g Finder, it looks for a glue doc file for the application "Finder".


Strings

jjore on 2007-02-07T22:10:07

I goofed one day when I expected -s to be the string "-s" just because it was a word preceded by the unary minus operator. D'oh!

system(
    '...',
    -s, 'something',
    -v,
    ...
);

Re:Strings

bart on 2007-02-07T22:18:50

It would have been, if you had it followed by => instead of a plain comma.

I Love This Flag!

chromatic on 2007-02-07T23:07:47

It's great for CGI programs too!

Re:I Love This Flag!

phaylon on 2007-02-08T00:39:29

register_globals ftw! :)