Построить массив из вывода - PullRequest
0 голосов
/ 09 ноября 2010

Я пытаюсь создать сценарий, который будет выводить системную команду, и я хочу организовать данные в массив.

Сценарий для обнаружения виртуальных машин, находящихся на локальном сервере ESXi, который у меня есть. Я использую plink.exe для отправки команды на сервер, а затем возвращает список виртуальных машин, который выглядит следующим образом.

Vmid   Name                File                 Guest OS      Version   Annotation
128    NS01    [datastore2] NS01/NS01.vmx     ubuntu64Guest   vmx-07
144    NS02    [datastore2] NS02/NS02.vmx     ubuntu64Guest   vmx-07
208    MX01    [datastore2] MX01/MX01.vmx     ubuntu64Guest   vmx-07
224    SQL01   [datastore2] SQL01/SQL01.vmx   ubuntu64Guest   vmx-07
240    WS01    [datastore2] WS01/WS01.vmx     ubuntu64Guest   vmx-07

Как бы я взял это и сделал из него массив? Единственные столбцы, которые действительно имеют значение, это VMID, Имя, Файл

Команда, которую я использую для получения вывода, такова.

# Parse ESX\ESXi server for virtual machines that reside on it
system ("$plink \-batch \-pw $esx_password $esx_user\@$esx_host vim-cmdvmsvc/getallvms\n");

Любое понимание было бы замечательно.

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Да, используйте обратные кавычки , а не system, если вы хотите проанализировать вывод.

my $cmd 
    = "$plink -batch -pw $esx_password $esx_user\@$esx_host "
    . "vim-cmdvmsvc/getallvms"
    ;
my @lines = `$cmd`;

system просто использует ваш стандартный выход.

Не уверен, почему вы избежали тире, хотя ...

Как только вы получите выход,Вы можете сделать следующее (обратите внимание, что я использовал внешний вид полей фиксированной длины):

foreach ( @line ) { 
    # this is the get-it-and-do-something-else-with-it version
    my ( $vmid, $name, $file )
        = substr( $_, 0, 47 ) =~ m/^ ( \d+ ) \s+ ( \S+ ) \s+ (.*\S) \s* $/x
        ;

    # OR the store-it-in-an-array-of-hashes version:
    @{ my $h = {}}{ qw<VMID Name File> }
        = substr( $_, 0, 47 ) =~ m/^ ( \d+ ) \s+ ( \S+ ) \s+ (.*\S) \s* $/x
        ;
    push @array, $h if %$h;
}
1 голос
/ 10 ноября 2010

Если ни один из столбцов данных не будет содержать пробелы, вы могли бы легко split(/\n/) выводить в строки, перебирать их и split(/\s+/) строки в массивах. Затем извлеките интересующие вас столбцы по индексу.

...