我正在尝试创建一个获取参数的脚本(用Perl编写)。呼叫应如下所示:
./script [action] --option1 --option2 ... --optionK
我为此使用GetOptions:Long
模块。另外,我使用$ARG[0]
来执行操作。示例:
./script report --color black --version 19.4
现在,我想赋予用户插入他想要的任何命令的权力(例如,它可以插入带有参数的另一个脚本)。 尽管我这样做是这样的:用户可以在命令行参数的末尾(仅)插入他想要的任何内容,例如:
./script report --color black --version 19.4 more and more --info 551_5 from --the user
我想解析此数组@ARGV
并将其他信息插入变量:
$additional = "more and more --info 551_5 from --the user"
我发现使用GetOptions
后,它将从$ARGV[0]
数组中删除那些选项(不包括@ARGV
)。
问题是,我真的不知道如何从阵列中获取其他信息。也许我应该添加一个附加选项,例如:
./script report --color black --version 19.4 --additional more and more --info 551_5 from --the user
并在additional
中获取所有内容。但是这样,我还有另一个问题-它会将--info
和--the
当作参数。
我该如何解决这个问题?
编辑:我发现可以使用pass_through
。但是,如果用户拥有的选项与我的可用选项之一相似,该怎么办?它可能会出现一些问题。是否可以像字符串一样处理它?同样,我还必须解析@ARGV
并删除$ARGV[0]
(操作)。
EDIT-2 :--
方法将起作用。但是在我看来,这是一种解决方法,而不是解决此问题的正确方法。必须有一种更清洁的方法来做到这一点。也许更改为其他模块?
答案 0 :(得分:6)
您可以使用--
分隔其他参数:./script --option1 --option2 -- --userOption1 --userOption2
https://metacpan.org/pod/Getopt::Long#Mixing-command-line-option-with-other-arguments
答案 1 :(得分:2)
如@Ujin所说,--
将在参数列表中的该点停止处理参数。您几乎正确的另一种选择是使用--additional。如果将以下文本括在引号中,则将起作用:'
用于UNIX / Linux,"
用于Windows。这将使shell认为引号中--additional之后的所有文本都是要传递给@ARGV的元素。然后,GetOptLong将正确地看到more and more --info 551_5 from --the user
作为--additional选项的参数。这使您的命令行看起来像
./script report --color black --version 19.4 --additional 'more and more --info 551_5 from --the user'