这是示例测试文件:
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'
因此,在这个文件中,如何搜索单词条形码并提取它的前五位数,同时将其传递给数组。
提前致谢。
答案 0 :(得分:6)
尝试正则表达式,这样的事情应该有效:
Barcode:\*(\d{5})
答案 1 :(得分:1)
正则表达式是一种方法。但是,只是为了给你一些完全不同的东西,以下是index
和substr
处理这些内容的方法:
my @array;
foreach my $line ( <$file> ) {
if ( index( $line, 'Barcode:' ) == 0 ) {
push @array, substr $line, 9, 5;
}
}
答案 2 :(得分:0)
我的解决方案类似于Manni,但我建议使用while
逐行读取文件。你可以像他一样使用substr(),但是带有锚点和没有量词的正则表达式会非常快:
my @barcodes; while( <$fh> ) { next unless m/^Barcode:\*([0-9]{5})/; push @barcodes, $1; }
根据我正在做的其他事情,我可能会改用地图。映射表达式位于列表上下文中,因此m //运算符返回它在任何括号中匹配的事物列表:
my @barcodes = map { m/^Barcode:\*([0-9]{5})/ } <$fh>;
我怀疑任何现实生活中的答案会有更多的代码来警告你以Barcode:
开头但缺少数字的行。我还没有遇到一个完美的输入文件:)
\ G锚点在你离开的地方拾取正则表达式匹配,在同一个字符串上的最后一个匹配,在这种情况下就在冒号之后:
my @barcodes; while( <$fh> ) { next unless m/^Barcode:/; unless( m/\G\*([0-9]{5])/ ) { warn "Barcode is missing number at line $.\n"; next; } push @barcodes, $1; }
答案 3 :(得分: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
}