1

这是示例测试文件:

  Barcode:*99899801000689811* 
  JSC4000I accountNumber:10006898Sequence Number:998 Envelopes: 1 
  LCD5010V Using jsl 'CUSOFF' for output page '6'
  Barcode:*99999901000673703* 
  LCD5010V Using jsl 'CUSOFF' for output page '4'
  LCD5005V Using job 'A' for current page '4'

所以,在这个文件中,如何搜索单词 Barcode 并提取它的前五位数字,同时将它传递到一个数组中。

提前致谢。

4

4 回答 4

6

尝试一个正则表达式,这样的东西应该可以工作:

Barcode:\*(\d{5})

于 2009-05-07T11:58:48.227 回答
1

正则表达式是一种方法。index但是,只是为了向您扔一些完全不同的东西,以下是使用and处理这些东西的方法substr

my @array;
foreach my $line ( <$file> ) {
    if ( index( $line, 'Barcode:' ) == 0 ) {
        push @array, substr $line, 9, 5;
    }
}
于 2009-05-07T12:17:20.790 回答
0

我的解决方案与 Manni 的类似,但我建议使用while逐行读取文件。您可以像他一样使用 substr() ,但是带有锚且没有量词的正则表达式将非常快:

我的@barcodes;
而( <$fh> )
    {
    下一个除非 m/^Barcode:\*([0-9]{5})/;

    推@barcodes,1美元;
    }

根据我在做什么,我可能只使用地图。map 表达式在列表上下文中,因此 m// 运算符在任何括号中返回它匹配的事物的列表:

my @barcodes = map { m/^Barcode:\*([0-9]{5})/ } <$fh>;

我怀疑任何现实生活中的答案都会有更多代码来警告您以开头Barcode:但缺少数字的行。我还没有遇到一个完美的输入文件:)

\G 锚在你离开的地方与同一字符串上的最后一个匹配项拾取正则表达式匹配,在这种情况下,就在冒号之后:

我的@barcodes;
而( <$fh> )
    {
    下一个除非 m/^Barcode:/;

    除非( m/\G\*([0-9]{5])/ )
        {
        warn "$ 行条码缺少数字。\n";
        下一个;
        }

    推@barcodes,1美元;
    }
于 2009-05-09T20:15:01.207 回答
0

数组上下文中的模式匹配将返回标记的值(由 '(' 和 ')')作为列表。将此与循环修饰符 'g' 结合使用以保持重新匹配,您可以在一行中完成所有操作,我认为它非常易读。

my $string =<<'HERE';
Barcode:*99899801000689811* 
JSC4000I accountNumber:10006898Sequence Number:998 Envelopes: 1 
LCD5010V Using jsl 'CUSOFF' for output page '6'
Barcode:*99999901000673703* 
LCD5010V Using jsl 'CUSOFF' for output page '4'
LCD5005V Using job 'A' for current page '4'
HERE

my @array = $string =~ m!Barcode:\*([0-9]{5})[0-9]+\*!g;

# or

foreach my $barcode ($string =~ m!Barcode:\*([0-9]{5})[0-9]+\*!g)
{
    # do stuff with $barcode
}
于 2009-05-09T20:18:01.917 回答