我需要从文件中读取一个块,然后需要匹配特定模式并获取匹配模式的值。
> 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 。喜欢我需要匹配某些行中的模式并获取该模式的值。我们怎样才能做到这一点?如果有人知道解决这个问题的方法请给我解决方案。
提前致谢。
答案 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,直到找到带有闭合花括号的行。 使用这种过滤器,您只能获得带有大括号的过滤器。