2011-09-24 24 views
1

我需要从文件中读取一个块,然后需要匹配特定模式并获取匹配模式的值。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作为表盘的值的两个{} braces.After之间的块-IN-SEQUENTIAL。同样,我需要匹配某些行中的模式并获取该模式的值。我们怎样才能做到这一点?如果有人知道如何解决这个问题,请给我解决方案。

在此先感谢。

+0

上面看起来像一个Perl散列。你为什么不能从哈希中读取。如果$ VAR1是Perl散列,只需执行:$ VAR1 - > {service_status}来访问该值。 –

回答

2

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

然后,您可以使用该模块并像通常的perl散列一样遍历变量。

2

好了,给定的约束我的解决方案是比较难看,但你可以把它作为一个正则表达式的锻炼(但能避免的话):

#!/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。 有了这种类型的过滤器,你只能在带有大括号的那些行之间插入行。