2015-02-24 40 views
0

我已经创建了一个函数来解析命令的输出。用于解析命令输出的正则表达式

的命令的输出将是以下:

Host-profile-count User  114 

(注:号码114是不constant.it可以是任何正数> = 0)

现在我只需要在号码(在这种情况下是114)被返回。 我想我的脚本中的正则表达式是错误的。当我运行脚本,我得到的输出为0.它应该是114. 有人可以帮助我与正则表达式吗?

sub _count { 

    my ($self) = @_; 
    my $cmd = 'command goes here '; 
    my $profiles = 0; 

    $self->execute($cmd); 

    foreach my $line (@{ $self->get_stdout() }) { 
     if ($line =~ m/Host\sprofile\scount\s+\S*\s+(\S*)/msx) { 
      $profiles = $1; 
     } 
    } 

    $profiles =~ s/^\s+|\s+$//msxg; 
    return $profiles; 
} 
+1

将单词之间的'\ s's更改为连字符,并且工作正常。你也不需要这些修饰符。 – hwnd 2015-02-24 02:44:46

+2

除非你需要检查是否存在Host-profile-count(这可能会更好地单独完成),我只会去'我的($ profiles)= $ line =〜/(\ d +)/'哪个找到第一个数字序列并将其分配给'$ profiles'。你不应该为你写的每一个正则表达式添加'/ msx' - 这会浪费你的代码读者难以理解的原因。 – Borodin 2015-02-24 03:10:19

回答

0

是的,你WRONLY置于其之间匹配\s它匹配任何空格字符),而不是连字符..

m/Host-profile-count\s+\S*\s+(\S*)/msx 

DEMO

添加一个字边界\b如果必要的话,在Host之前的字词字符和非字词字符)。

+0

boundary \ b?你可以向我解释为什么这是必需的吗? – user3587025 2015-02-24 02:48:32

+0

没有'\ b',上面的正则表达式也会在'foobarHost-profile-count User 114'中找到一个匹配。 '\ bHost-profile-count \ s + \ S * \ s +(\ S *)'不会像上面那样做。 – 2015-02-24 02:50:30

+0

好的,谢谢你的解释。 – user3587025 2015-02-24 02:52:49