Сопоставление данных из выходной таблицы - PullRequest
0 голосов
/ 12 декабря 2011

Нам нужно сопоставить определенный элемент данных по элементу, который является выводом в табличной форме, полученным из командной строки. В настоящее время используется следующий подход, в котором $ Var содержит вывод. Есть ли оптимальный способ сделать это без направления вывода команды в файл.

Пожалуйста, поделитесь своими мыслями.

$Var = "iSCSI Storage     LHN StgMgmt Name  IP              Name
==============================================================
0                 Storage_1         15.178.209.194  admin
1                 acct-mgmt         15.178.209.194  storage1
2                 acct-mgmt2        15.178.209.194  storage2";

@tab = split("\n",$Var);
foreach (@tab) {
    next if ($_ !~ /^\d/);
    $_ =~ s/\s+//g;
    $first=0 if($_ =~ /Storage/i && /15.178.209.194/);
    push(@Array, $_); }

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Если я правильно вас понимаю, вы хотите вызвать свой скрипт следующим образом:

./some_shell_command | perl perl_script.pl

То, что вы хотите использовать, - это Perl-алмазный оператор <>:

#!/usr/bin/perl

use strict;
use warnings;

my $first;
my @Array;

for (<>) {
    next unless /^\d/;
    s/\s+/ /g;
    $first = 0 if /Storage/i && /15.178.209.194/;
    push(@Array, $_);
}

IВы удалили избыточное использование $_ и исправили замену, поскольку вы, вероятно, не хотите удалять все пробелы.

1 голос
/ 12 декабря 2011

$_ =~ /Storage/i && /15.178.209.194/ глупо. Это разбивается так: ($_ =~ /Storage/i) && (/15.178.209.194/). Либо используйте $_ постоянно, либо не используйте - операторы // и s/// автоматически работают на $_.

Также вы должны знать, что в регулярном выражении /15.178.209.194/ . интерпретируется как любой символ. Либо избегайте их, либо используйте функцию index().

Кроме того, я бы порекомендовал разделять каждую строку, используя split(). Это позволяет сравнивать каждый отдельный столбец. Вы можете использовать split() с регулярным выражением, например, так: @array = split(/\s+/, $string);.

Наконец, я не совсем уверен, для чего нужен $first, но я замечаю, что все три строки выборки во входном сигнале запускают $first=0, так как все они содержат этот IP и строку "storage".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...