无法提取正则表达式匹配,返回“1”而不是字符串

时间:2011-06-30 12:12:09

标签: regex perl

我看到了奇怪的问题..请帮忙。 我有一个看起来像这样的日志模板

            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”但没有字符串。

3 个答案:

答案 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;