perl函数解析命令输出

时间:2015-05-19 21:15:57

标签: regex perl

我编写了一个执行命令并解析命令输出的perl函数。该命令将提供下面提到的输出。在函数调用中,我将1到5之间的数字作为参数传递。 ' 1'对应于lan,2对应于wan,' 3'对应名称等。 (见下面的输出)。例如,如果在函数调用中将1作为参数传递,则预期输出为' 0' 0 (1 = lan和lan的值= 0)。当我执行脚本时我没有得到预期的输出。返回null。有什么建议吗?

命令输出1:

[
    {
       "lan" : 0,           #1
       "wan" : 0,           #2
       "name" : "XYZ",      #3 
       "packets" : 0,       #4
       "bytes" : 0          #5
    }
]

函数调用

$self->{'stats_obj'} = Statistics->new( ip => "ip addr")

    my $result = $self->{'stats_obj'}->statistics_get('1');
       INFO('statistics:' . $result );

功能:

sub statistics_get{
    my ($self, $option)= @_;

    my $result = $self->_get_hyd_tc();

    return $result->{$option};

}

sub _get_hyd_tc {

    my ($self)  = @_;

    my $opt;
    my %result;
    my $line;

    my $cmd     = 'cmd goes here';

    $self->execute($cmd);

    my $count =0;

    foreach my $line (  $self->output() ) {
    chomp $line;

    if ( $line =~ /(Requested table doesn't.*)/i ){

        ERROR('table doesnt exist'  . $line)

    }

    if ($line =~ /(.*)/) {

        $opt = $1;
        $count = 0;

   }
     elsif ( $line =~ /(.*)/) {

        my $key = $1;
        my $value = $2;
        $result{$opt}{++$count} = $value;
       }
    }

    return \%result;

}

1 个答案:

答案 0 :(得分:0)

你正以错误的方式接近这一点。

您提供的代码片段是JSON。真的 - 到目前为止你最好的选择是将其作为JSON处理,而不是自己尝试解析它。

这样的事情:

use strict;
use warnings;

use JSON;
use Data::Dumper;

my $command_output = '[
    {
       "lan" : 0,           
       "wan" : 0,           
       "name" : "XYZ",       
       "packets" : 0,       
       "bytes" : 0          
    }
]';


my $json_ob = decode_json( $command_output );
print Dumper \$json_ob;

print $json_ob -> [0] -> {'name'};

文本中的[]表示数组。 通常表示多个元素。您可以迭代这些元素,但正如您刚刚获得的那样,通过[0]访问它就可以了。

现在,如果你真的希望将“单词”中的属性映射到数字,那么你可以......但实际上没有任何需要。

但要回答你的问题 - 为什么null会被退回 - 这是因为:

if ($line =~ /(.*)/) {

总是评估为真 - 零或更多。

因此,您永远不会运行第二个elsif循环,所以这永远不会发生:

    $result{$opt}{++$count} = $value;

所以你永远不会有一个空数组返回。