2011-09-24 41 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。 有了這種類型的過濾器,你只能在帶有大括號的那些行之間插入行。