如何使用 perl -e 将命令行选项传递给 Perl 程序?

sim*_*que 3 bash perl

我想将以破折号(---)开头的命令行选项传递给我正在使用以下标志运行的 Perl 程序-e

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

传递不以-明显工作开头的参数:

$ perl -E 'say @ARGV' foo
foo
Run Code Online (Sandbox Code Playgroud)

我如何正确转义这些以便程序正确读取它们?

我尝试了很多变体,例如\-foo,,,,。尽管有些会产生不同的消息,但这些都不起作用。实际运行并输出.\\-foo'-foo''\-foo''\\-foo'\\-foo\-foo

jm6*_*666 5

您可以使用-s,例如:

perl -se 'print "got $some\n"' -- -some=SOME
Run Code Online (Sandbox Code Playgroud)

以上打印:

got SOME
Run Code Online (Sandbox Code Playgroud)

来自perlrun

-s 启用命令行上程序名之后但任何文件名参数之前(或 -- 参数之前)的开关的基本开关解析。在那里找到的任何开关都会从 @ARGV 中删除,并在 Perl 程序中设置相应的变量。如果使用 -xyz 开关调用以下程序,则打印“1”;如果使用 -xyz=abc 调用该程序,则打印“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.
Run Code Online (Sandbox Code Playgroud)

对于简单的参数传递,请使用--,例如:

perl -E 'say "@ARGV"' -- -some -xxx -ddd
Run Code Online (Sandbox Code Playgroud)

印刷

-some -xxx -ddd
Run Code Online (Sandbox Code Playgroud)