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