simbabque
simbabque

Reputation: 54323

How do I pass command line options to a Perl program with perl -e?

I want to pass command line options that start with a dash (- or --) to a Perl programm I am running with the -e flag:

$ perl -E 'say @ARGV' -foo
Unrecognized switch: -foo  (-h will show valid options).

Passing arguments that don't start with a - obviously work:

$ perl -E 'say @ARGV' foo
foo

How do I properly escape those so the program reads them correctly?

I tried a bunch of variations like \-foo, \\-foo, '-foo', '\-foo', '\\-foo'. None of those work though some produce different messages. \\-foo actually runs and outputs \-foo.

Upvotes: 3

Views: 496

Answers (2)

DomQ
DomQ

Reputation: 4644

Just pass -- before the flags that are to go to the program, like so:

  perl -e 'print join("/", @ARGV)' -- -foo bar

prints

  -foo/bar

Upvotes: 3

clt60
clt60

Reputation: 63902

You can use the -s, like:

perl -se 'print "got $some\n"' -- -some=SOME

the above prints:

got SOME

From the perlrun:

-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 --). 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 a switch like --help creates the variable "${-help}", which is not compliant with "use strict
        "refs"".  Also, when using this option on a script with warnings enabled you may get a lot of spurious
        "used only once" warnings.

For the simple arg-passing use the --, like:

perl -E 'say "@ARGV"' -- -some -xxx -ddd

prints

-some -xxx -ddd

Upvotes: 6

Related Questions