2015-12-22 70 views
2

所有領先/填充字符我使用Parse::FixedLength,我想刪除領先0 s,而解析可惜,當整個字符串是由0的IT返回空值。這意味着我無法區分不良輸入(空白)和後處理空白輸入。避免微調使用Parse ::定長

use Parse::FixedLength; 

    my $parser = Parse::FixedLength->new([ 
      first_name => '10:1:10', 
      last_name => '10:11:20', 
      widgets_this_month => '5R0:21:25', 
    ], {trim => '1'}); 

    while (<DATA>) { 
      warn "No record terminator found!\n" unless chomp; 
      warn "Short Record!\n" unless $parser->length == length; 
      my $data = $parser->parse($_); 
      print $data->{'widgets_this_month'},$/; 
    } 
    __DATA__ 
    JOHN  SMITH  00005 
    BOB  JONES  00000 
    JOE  STAN  00117 
    BLANK  WIDGET 
    JANE  DOE  00007 

輸出是(<空白>下面是空字符串):

5 
<blank> 
117 
<blank> 
7 

我所要的輸出是:

5 
0 
117 
<blank> 
7 

我如何能做到這一點有什麼想法?順便說一句,以上是模塊中的一個玩具例子。我的實際文件有超過1200個字段,幾乎所有人(不是全部)都領先0 s。

謝謝!

+0

有什麼理由不讓它們不被修剪? – ysth

+0

@ysth這些文件非常大(20 + GB),大多數字段都有填充字符。不保留填充字符將有助於減小尺寸,並允許我在下游程序中讀取它,而無需處理填充字符。我可以讓它們不被修剪,然後在解析完成後進行修剪,但隨後我將不得不遍歷所有的字段並刪除填充,這非常麻煩。如果有一個更清潔的後處理解決方案,那也可以工作 – Ecognium

回答

2

簡短的回答是否定的。在修剪零填充字段時,沒有辦法使Parser::FixedLength不能讀取全0。這是它爲修剪設置的正則表達式:

'TPAD' => ARRAY(0x7fb378979a08) 
    0 (?^:^0+) 
     -> qr/(?^:^0+)/ 

因此它讀取所有的零。但是,您可以濫用這個內部數據結構,使一個黑客工具,將實現你在找什麼:

$parser->{TPAD}[0] = qr/^0+(?=\d)/;

這將設置裝飾正則表達式有一個積極前瞻的另一個數字,所以它當Parser :: FixedLength修剪它時,將至少保存一位數字。

+0

非常感謝!有用。我會證明這條線是黑客。 – Ecognium