2011-12-12 52 views
-2

我们需要通过在命令提示符处获得的表格形式的输出来匹配某个数据元素。以下是当前遵循的方法,其中$ 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, $_); } 
+0

您想处理/存储第一行,如''0Storage_115.178.209.194admin''?你意识到1)你对'$ first'什么都不做? 2)它不是本地的循环,你永远不会解除它?它似乎没有做任何事情,并且在循环工作之前,一个'shift @ tab'对于#1可能获得的任何特殊行为都是如此。 – Axeman

回答

1

$_ =~ /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”。

+0

谢谢DAN。答案对我来说非常有用 – Nitesh

1

如果我理解正确,你要调用你的脚本是这样的:

./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, $_); 
} 

我已经去除了冗余使用$_并修复了您的替换,因为您可能不想删除所有空格。