Передайте множественные значения аргументу командной строки и сохраните его как массив - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь передать множественные значения в аргумент командной строки как -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 ]

0 голосов
/ 26 января 2019

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

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;
0 голосов
/ 26 января 2019

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

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

Попробуйте:

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

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

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