2013-11-04 74 views
3

我的正則表達式不如它應該的那麼好,我提前道歉。正則表達式來分割鍵值對,忽略雙引號中的空格

代碼:

#!/usr/bin/perl -wT 
use strict; 
use warnings; 
use Text::ParseWords; 

my @AoH; 
my $filename = 'metadata.txt'; 

open(my $fh, '<', $filename) or die "Could not open file '$filename' $!"; 
while (<$fh>) { 
    my $rec = {}; 
    for my $field (split) { 
     (my $key, my $value) = quotewords('=', 0, $field); 
     $rec->{$key} = $value; 
     print "$key -> $value;\n"; 
    } 
    push @AoH, $rec; 
} 

我想分析以下字符串(位於metadata.txt):

video_info = 「這是一個視頻的描述」 VIDEO_NAME = 「avideoname.mp4」 video_thumb =「avideothumbnail.jpg」

本質上,我想分割上述的字符串,以便任何引號是一個值(包括whitespaces)和wh atever在=之前是一個關鍵。

我所需的輸出:

video_info -> This is a video description; 
video_name -> avidenoname.mp4; 
video_thumb -> avideothumbnail.jpg; 

我使用此作爲參考,以創建我哈希值的陣列:(例如,使用代替分裂quotewords)http://docstore.mik.ua/orelly/perl/prog3/ch09_03.htm,稍作修改的代碼。我覺得這主要是一個正則表達式的問題,但是如果有任何問題或被棄用的代碼被使用,請隨時糾正/解釋任何不一致的地方。

任何幫助,將不勝感激。提前致謝。

回答

8

split不適合將由空格分隔的字符串拆分爲也包含空格的兩個子字符串。

例如,在你的情況下,使用split這一行:

video_info="This is a video description" video_name="avideoname.mp4" 

會給出一個數組如下:

qw(video_info="This, is, a, video, description", video_name="avideoname.mp4") 

這絕對不是想要的輸出。

相反,你可以使用quotewords拆分此行:

quotewords('\s+', 0, $_) 

會給:

qw(video_info="This is a video description", video_name="avideoname.mp4") 

此外,它處理一個行刪除的\n影響前更好地chomp

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use Text::ParseWords; 

my @AoH; 
my $filename = 'metadata.txt'; 

open(my $fh, '<', $filename) or die "Could not open file '$filename' $!"; 
while (<$fh>) { 
    chomp; 
    my $rec = {}; 
    for my $field (quotewords('\s+', 0, $_)) { 
     (my $key, my $value) = quotewords('=', 0, $field); 
     $rec->{$key} = $value; 
     print "$key -> $value;\n"; 
    } 
    push @AoH, $rec; 
} 
+0

詳細的解釋和簡潔的答案。謝謝。 – s37syed

相關問題