在GetOptions中插入并使用未知选项

时间:2018-10-25 12:54:47

标签: perl

我正在尝试创建一个获取参数的脚本(用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 --方法将起作用。但是在我看来,这是一种解决方法,而不是解决此问题的正确方法。必须有一种更清洁的方法来做到这一点。也许更改为其他模块?

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'