Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

bash

perl

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.

like image 720
simbabque Avatar asked Nov 27 '25 20:11

simbabque


1 Answers

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
like image 147
jm666 Avatar answered Nov 29 '25 15:11

jm666



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!