阻止阅读perl

时间:2011-09-24 09:44:39

标签: perl

我需要从文件中读取一个块,然后需要匹配特定模式并获取匹配模式的值。

> 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 个答案:

答案 0 :(得分:2)

您可以处理该文件,使其成为包含散列数组定义的有效perl模块。编写一个过滤器(或者使用emacs / vim或您喜欢的编辑器)将“调用报告:$ VAR1 = {”替换为将哈希推入数组的语句,例如“push @all_hashes,{”。 / p>

然后你可以使用模块并将变量迭代为普通的perl哈希值。

答案 1 :(得分:2)

好吧,考虑到约束我的解决方案相当丑陋,但你可以把它作为正则表达式练习(但你可以避免它):

#!/usr/bin/env perl

use v5.12;
use strict;

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

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

请注意我是如何在第一个条件中使用触发器操作符,以及在第二个条件中使用正向后视图。

第一个条件在找到没有打开或关闭大括号的行时返回true;当它返回false时,它会一直返回true,直到找到带有闭合花括号的行。 使用这种过滤器,您只能获得带有大括号的过滤器。