我们需要在命令提示符下获得的表格形式的元素匹配某些数据元素。以下是当前遵循的方法,其中$ 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 :(得分: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”。
答案 1 :(得分: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, $_);
}
我删除了$_
的多余用途并修复了您的替换,因为您可能不想删除所有空格。