将多个值传递给命令行参数并将其存储为数组

时间:2019-01-25 22:04:27

标签: perl getopt-long

我试图将多个值作为-cmd'cp abc def''ls abd / def / ghi'等传递给命令行参数,并希望将它们分别存储为数组的元素。我可以将其转换为字符串并使用split函数。我正在尝试使用GetOptions实现相同的目的。我不确定它提供数组大小的原因。请帮我解决一下这个。

use strict;    
use warnings;    
use Getopt::Long;    

my( $cmd ,$pro, $dom );      

GetOptions ( 'pro=s' => \$pro ,   
             'dom=s' => \$dom ,    
             'cmd=s@{1,}' => \$cmd );     



print $pro."\n".@$cmd."\n".$dom."\n" ;     

-->./abc.pl -pro JKFK -cmd 'ls abc/bcd/def' 'cp abn/cdf ads' -dom ABC        


Expected:     
JKFK    
['ls abc/bcd/def','cp abn/cdf ads']    
ABC    

Actual Results :    
JKFK    
2    
ABC  

我试图获取用户提供的这些系统命令,并将这些命令直接转到数据库表。我试图将这些系统命令作为数组中的一个元素存储,以便于解析和插入数据库表中。 请帮助我将它们放入数组。

谢谢。

2 个答案:

答案 0 :(得分:5)

您要在标量上下文中评估数组:

print $pro."\n".@$cmd."\n".$dom."\n" 

尝试:

print $pro."\n@$cmd\n".$dom."\n"

换句话说,使用内插,对于数组,其等效于join($", @array)-其中$"默认为空格。这意味着您可以使用以下内容:

print $pro."\n".join(' ', @$cmd)."\n".$dom."\n" 

答案 1 :(得分:1)

您的输出方法不会以任何方式在您想要的输出中显示括号。

print join("\n", $pro, "[ '" . join("', '", @$cmd) . "' ]", $dom, "");

use Data::Dump; # This is a CPAN module that's not normally installed by default

dd $pro, $cmd, $dom;