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 という単語を検索して最初の 5 桁を抽出し、同時にそれを配列に渡す方法を説明します。

前もって感謝します。

4

4 に答える 4

6

正規表現を試してみてください。次のようなものが機能するはずです。

Barcode:\*(\d{5})

于 2009-05-07T11:58:48.227 に答える
1

正規表現は 1 つの方法です。ただし、まったく異なるものを投げるために、indexandを使用してそれらを処理する方法を次に示し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いますが、ファイルを1行ずつ読み取るために使用することをお勧めします。彼と同じようにsubstr()を使用できますが、アンカーがあり、数量詞がない正規表現はかなり高速になります。

私の@barcodes;
while(<$ fh>)
    {{
    次の場合m/^ Barcode:\ *([0-9] {5})/;

    プッシュ@バーコード、$ 1;
    }

他に何をしていたかによっては、代わりに地図を使用することもあります。マップ式はリストコンテキストにあるため、m //演算子は、一致したもののリストを括弧で囲んで返します。

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

実際の回答には、で始まるBarcode:が番号が欠落している行について警告するためのコードがもう少しあると思います。私はまだ完璧な入力ファイルを満たしていません:)

\ Gアンカーは、同じ文字列の最後の一致で中断した正規表現の一致を取得します。この場合は、コロンの直後です。

私の@barcodes;
while(<$ fh>)
    {{
    m / ^ Barcode:/;でない限り、次へ

    (m / \ G \ *([0-9] {5])/)
        {{
        警告"バーコードに$行の番号がありません。\n";
        次;
        }

    プッシュ@バーコード、$ 1;
    }
于 2009-05-09T20:15:01.207 に答える
0

配列コンテキストでのパターン一致は、('('および')'でマークされた値をリストとして返します。これをループ修飾子「g」と組み合わせて再マッチングを維持すると、すべてを1行で実行でき、非常に読みやすいと思います。

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 に答える