Передайте множественные значения аргументу командной строки и сохраните его как массив

Я пытаюсь передать множественные значения в аргумент командной строки как -cmd 'cp abc def' 'ls abd/def/ghi' и т. Д. И хотел сохранить их по отдельности как элемент массива. Я могу взять это в строку и использовать функцию разделения. Я пытаюсь достичь того же, используя 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 ответа

Вы оцениваете массив в скалярном контексте:

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

Пытаться:

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

Другими словами, используйте интерполяцию, которая для массивов эквивалентна join($", @array) - где $" по умолчанию используется пробел Это означает, что вы можете использовать следующее:

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

Ваш метод вывода никоим образом не предлагает скобки в выводе, который вы хотите.

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;
Другие вопросы по тегам