我编写了一个执行命令并解析命令输出的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;
}
答案 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;
所以你永远不会有一个空数组返回。