避免使用Parse :: FixedLength修剪所有前导/填充字符

时间:2015-12-22 06:08:25

标签: perl

我正在使用Parse::FixedLength,我希望在解析时删除前导UITableView但不幸的是,当整个字符串由0组成时,它会返回一个空值。这意味着我无法区分错误的输入(空白)和后处理的空白输入。

0

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

    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

有关如何实现这一目标的任何想法?顺便说一句,以上是该模块的玩具示例。我的实际文件有超过1200个字段,几乎每个人(不是全部)都有5 0 117 <blank> 7 个。

谢谢!

1 个答案:

答案 0 :(得分:2)

简短的回答是否定的。修剪零填充字段时,无法使Parser::FixedLength无法读取所有0。这是它为修剪设置的正则表达式:

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

所以它读取所有零。但是,您可以滥用此内部数据结构并制作可实现您所需内容的黑客攻击:

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

这会将trim正则表达式设置为对另一个数字具有正向前瞻,因此当Parser :: FixedLength修剪它时,它将至少保存一个数字。