【发布时间】:2015-03-27 12:41:13
【问题描述】:
编辑 - 答案贴在下面
我有一个通常使用@ARGV 参数的脚本,但在某些情况下,它由另一个脚本(我无法修改)调用,而该脚本只传递了一个配置文件名,其中除其他外还有本应使用的命令行选项直接通过。
例子:
Args=--test --pdf "C:\testing\my pdf files\test.pdf"
如果可能的话,我想要一种方法将此字符串解析为与@ARGV 相同的数组。
我有一个解决方法,我设置了一个只回显@ARGV 的外部 perl 脚本,然后我像下面这样调用这个脚本(标准样板已删除)。
echo-args.pl
print join ("\n", @ARGV);
test-echo-args.pl
$my_args = '--test --pdf "C:\testing\my pdf files\test.pdf"';
@args = map { chomp ; $_ } `perl echo-args.pl $my_args`;
这看起来不优雅,但它确实有效。有没有更好的方法而不调用新流程?我确实尝试过拆分和处理,但是命令行上有一些奇怪的地方,例如-a"b c" 变成 '-ab c' 和 -a"b"" 变成 -ab",我宁愿不担心边缘情况,但我知道如果我不这样做,那总有一天会咬我。
【问题讨论】:
-
看起来你需要使用反引号或者
system来执行命令行,但是以Args为参数的应用是什么? -
我不确定这与问题有什么关系,但 test-echo-args.pl 就是这样一个应用程序的一个例子。假设字符串 $my_args 来自文件。我们如何将该字符串解析为数组?
-
我试图了解什么是脚本,什么是另一个脚本,以及
Args=--test ...是一个例子。只有你知道答案,你才清楚!如果您要编写一个可以使用其命令行参数的程序,或者从STDIN读取(如果没有),那么您只需要编写if ( @ARGV ) { ... }但我怀疑您的问题不止于此 -
程序 A 设计为正常使用
@ARGV。程序 B 将调用程序 A,但不会使用正确的命令行。相反,它将字符串写入配置文件,并在命令行上提供配置文件名。然后程序 A 需要读取这个配置文件,找到参数字符串并处理它。由于我们已经有了解析@ARGV的代码,我们希望重用它而不是重新发明轮子。我们将通过将字符串拆分为数组来做到这一点。上面的示例以简化的方式显示了这种情况。显示其他细节会偏离重点。 -
提示:
while ($num > 0) { --$num; ... }=>while ($num--) { ... }。或者在这种情况下,for (1..$num) { ... }