1

私は Perl を使い始めており、while ループで行ごとにテキストを解析していますが、この特定の問題に関するヘルプが見つかりませんでした。現在のテキスト行で以前に読んだテキスト行の情報を使用したいと思います。

私のコードは次のとおりです。

while(<data>){

    my $message = substr $_, 0, 1;

    if ($message eq 'A'){

        my $order_ref  = substr $_,  1, 9;
        my $order_book = substr $_, 20, 6;

        push @add_orders, $_;
        print add_order_file "$order_ref,$order_book\n";
    }
    if ($message eq 'X'){

        my $order_ref = substr $_, 1, 9;
        #now I would like to use order_ref to look up order_book from a previous line of text 
        # where the message is equal to A, 
        my $order_book = LOOKED UP VALUE FROM PREVIOUS TEXT;

        push @add_orders, $_;
        print add_order_file "$order_ref,$order_book\n";
    }
}

「A」メッセージは常に「X」メッセージの前にあるため、order_ref 番号を含む X エントリが表示された場合は、スクロールして戻って関連する A メッセージを見つけ、そこから order_book 変数を引き出すことができます。これにはある種の正規表現が関係していることはわかっていますが、Perl に前の行だけを検索させる方法がわかりません。ありがとう!

編集:これについてはもっと明確にする必要があります。「A」メッセージは「X」メッセージに先行しますが、すべて異なる order_ref を持つことができるため、データは次のようになります。

A order_ref1, order_book1
A order_ref2,order_book2
A order_ref3,order_book1
X order_ref2 
X order_ref1

X オーダーの場合、order_ref2 と order_ref1 を使用して order_book を検索します。

4

2 に答える 2

0

TLPの答えはすでに正しいです。コードに対するその他の提案を次に示します。

use strict; use warnings;
my @add_orders;
my $last_order_book;
while (my $line = <DATA>) {
  my $message = substr $line, 0, 1;

  if ( $message eq "A" ) {
    my $order_ref  = substr $line, 1,  9;
    my $order_book = $last_order_book = substr $line, 20, 6;

    push( @add_orders, $line );
    print "$order_ref,$order_book\n";
  }
  elsif ( $message eq "Q" ) {
    # Stuff happening ...
  }
  elsif ( $message eq "X" ) {
    my $order_ref = substr $line, 1, 9;

    my $order_book = $last_order_book;

    push( @add_orders, $line );
    print "$order_ref,$order_book\n";
  }
}

__DATA__
A123456789012345678901234567890
XLine XLine XLine XLine XABCDEF

コードのいくつかを変更しました。

まず、あなたの質問に答えましょう$order_book:ループ内で使用したくない場合は、ブロックの外側にスコープが設定された変数を追加して、変数を格納できます。と名付けました$last_order_book。部品から最後に見た値を記憶します"A"。のように連鎖させることで、複数の変数に値を代入できることに注意してくださいmy $foo = my $bar = "baz"

今私の提案に:

  • いつもuse strictuse warnings。あなたがしたかどうかはわかりませんが、念のため言っておきます。
  • あなたは$_たくさん使っています。明示的に頻繁に使用する必要がある場合は、実際には名前を付けて代わりに使用する必要があると思います。後で何が起こっているのかを理解するのに苦労することはありません。
  • 各行には 1 種類の しか持て$messageないため、複数の構造を持つことは意味がありませんif {}。代わりに、if {} elsif {}各種類の行が発生する回数でそれらを使用して並べ替えます。if条件の 1 つが見つかると -construct全体の実行が停止されるため、時間を節約できます。これは大量のデータを扱う場合に便利ですが、常にこの方法で行っても問題はありません。より明確にするために、$message eq "Q"ケースを追加しました。
于 2012-09-04T14:54:30.737 に答える