我看到了奇怪的问题..请帮忙。 我有一个看起来像这样的日志模板
CPU load: 0
Memory load: 7
User load: 0
Interface Information:
eth0: Up
eth1: Up
Processes Information:
现在,我登录我的设备并获取日志 我的@output = $ ssh-> exec(“显示详细信息”); 输出看起来类似,如下所示,但参数值不同
CPU load: 21
Memory load: 27
User load: 21
Interface Information:
eth0: Down
eth1: Up
Processes Information:
首先,我打开模板文件,将其拆分为一行一行,当我尝试时 使用“show details”输出进行比较,对于匹配,我得到的值为1 而不是匹配的字符串。有人可以帮忙。
代码:
my @output = $ssh->exec("show details");
open (FH, "templates/SHOW.txt") || die "Could not open File: $!\n";
@file_array = <FH>;
@TemplateArray = split(/\n/,@file_array);
@matches = split(/\n/,@output);
foreach $keys (@matches) {
foreach (@TemplateArray) {
$keys =~ m/($_)/;
unshift (@result_array, $1);
}
}
print "\n @result_array\n";
}
我得到“1”但没有字符串。
答案 0 :(得分:4)
在数组上使用split
时,数组将处于标量上下文中,并且只返回其中的元素数。换句话说:
@TemplateArray = split(/\n/,@file_array);
@matches = split(/\n/,@output);
等于:
@TemplateArray = $#file_array;
@matches = $#output;
这就是为什么你得到“1”的原因。
另外,如果您还没有这样做:
use strict;
use warnings;
答案 1 :(得分:0)
添加到TLP的答案,解决方案是更改
@matches = split(/\n/,@output);
到
@matches = map { split(/\n/, $_) } @output;
因此split()
对来自@output
的字符串进行操作。
答案 2 :(得分:0)
split
的第二个参数需要一个字符串,所以
@TemplateArray = split(/\n/, @file_array);
最终与
相同@TemplateArray = split(/\n/, scalar(@file_array));
请记住,scalar(@file_array)
会返回数组中元素的数量。
@file_array = <FH>;
将填充@file_array
,如下所示:
@file_array = (
"line1\n",
"line2\n",
"line3\n",
);
换句话说,它已经分成了几行。如果您尝试删除尾随换行符,则需要替换
@TemplateArray = split(/\n/,@file_array);
与
chomp( my @TemplateArray = @file_array );
我无法帮你修复
@matches = split(/\n/,@output);
因为我不知道$ssh
包含什么,因此我不知道@output
包含什么。
请使用
use strict;
use warnings;