блокировка чтения в perl - PullRequest
       1

блокировка чтения в perl

1 голос
/ 24 сентября 2011

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

> Call report:$VAR1 = {
>           'service_status' => 'DIAL-IN-SEQUENTIAL',
>           'called_id' => '761',
>           'id' => '41298',
>           'redirect_number' => undef,
>           'profile_id' => '137',
>           'not_answered_action' => '0',
>           'call_landed_day' => '1',
>           'call_end_status' => 'CALLER_HANGSUP',
>           'announce_caller_type' => '0',
>           'user_id' => '143',
>           'follow_me_group' => '135',
>           'call_end_time' => '29/11/2010 09:39:57',
>           'findme_id' => '135',
>           'fmsonenumber' => '43902761',
>           'profile_cause' => 'IMMEDIATE_OVERRIDE',
>           'fms_id' => '85dd3b2a-fb6e-11df-a0b0-a1f3d600a5a6',
>           'caller_type' => 'UNKNOWN',
>           'fms_type' => 'FOLLOWME',
>           'profile_desc' => 'office',
>           'caller_id' => '43902761',
>           'call_landed_time' => '29/11/2010 09:39:55'
>         };

Из вышеприведенного блока мне нужно прочитать блок между двумя фигурными скобками {}. После этого я хочу сопоставить конкретный шаблон, такой как service_status, а затем после сопоставления с шаблоном service_status должен извлечь значение service_status как DIAL-IN-SEQUENTIAL. Также мне нужно сопоставить шаблоны в некоторых строках и получить значения для этих шаблонов. Как мы можем достичь этого? Если кто-нибудь знает способ решить эту проблему, дайте мне решение.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Что ж, учитывая ограничения, мое решение довольно уродливо, но вы можете получить его как упражнение регулярного выражения (но вы можете избежать этого):

#!/usr/bin/env perl

use v5.12;
use strict;

open my $fh, '<', 'block.txt';

while ( <$fh> ) {
    if ( /^[^}^{]++$/ .. /^[^}]++$/ ) {
        if ( /(?<='service_status' => )'([^']+)'/ ) { say $1 };
    }
}

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

Первое условное возвращает true, когда находит строку без открытой или закрытой фигурной скобки;он возвращает true, пока не найдет строку с закрытой фигурной скобкой, когда вернет false.С этим типом фильтра вы получаете только строки между скобками.

2 голосов
/ 24 сентября 2011

Вы можете обработать файл так, чтобы он стал действительным модулем perl, который содержит определение массива хэшей. Напишите фильтр (или сделайте это с помощью emacs / vim или вашего любимого редактора), чтобы заменить «Отчет о вызове: $ VAR1 = {» на оператор, который помещает хеш в массив, что-то вроде «push @all_hashes, {».

Затем вы можете использовать модуль и перебирать переменные как обычные perl-хэши.

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