Не удалось извлечь совпадения с регулярным выражением, вместо строки выведите «1» - PullRequest
0 голосов
/ 30 июня 2011

Я вижу странную проблему ... может, пожалуйста, помогите. У меня есть шаблон журнала, который выглядит следующим образом

            CPU load:    0
            Memory load: 7
            User load:   0
            Interface Information:
              eth0: Up
              eth1: Up
            Processes Information:

Теперь я захожу на свое устройство и получаю логи как my @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 ]

4 голосов
/ 30 июня 2011

Когда вы используете split для массива, массив будет находиться в скалярном контексте и будет возвращать только количество элементов в нем. Другими словами:

@TemplateArray = split(/\n/,@file_array);
@matches = split(/\n/,@output);

невероятно похож на:

@TemplateArray = $#file_array;
@matches       = $#output;

Именно поэтому в результате вы получаете "1".

Кроме того, если вы этого еще не сделали:

use strict;
use warnings;
0 голосов
/ 30 июня 2011

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;
0 голосов
/ 30 июня 2011

Если добавить ответ TLP, решение состоит в том, чтобы изменить

@matches = split(/\n/,@output);

до

@matches = map { split(/\n/, $_) } @output;

, поэтому split() работает со строками из @output.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...