0

行頭をパイプ (|) で固定しようとしているプログラムがあります。ただし、実行すると、ファイル内の行が削減または削除されます。ご覧のとおり、何かを置き換えようとしているわけではありません。特定の行の先頭。プログラムは次のとおりです。

$DESCRIPTION = qr/^[0-9]+\.[0-9]+ +.*? {2,}[0-9]+.*? {2,}[0-9]+.*? {2,}[0-9]+.*? {2,}[0-9]+.*?$/;
$PRICELINE = qr/^[0-9]+.*? {2,}[0-9]+.*?$/;
$PRICELINE2 = qr/^.*? {2,}[0-9]+\.[0-9]+ {2,}[0-9]+\$/;
$CODE = qr/^\w{9}$/;
$date = qr/^AS OF.*?$/;
$accountnumber = qr/^ACCOUNT NUMBER.*?$/;
$name = qr/^CEOTID.*?$/;

while (<>) {
    if (s/($DESCRIPTION)/\|$1/gi) {print STDOUT "1\n"; next LINE;};
    if (s/($PRICELINE)/\|$1/gi) {print STDOUT "2\n"; next LINE;};
    if (s/($PRICELINE2)/\|$1/gi) {print STDOUT "3\n"; next LINE;};
    if (s/($CUSIP)/\|$1/gi) {print STDOUT "4\n"; next LINE;};
    if (s/($date)/\|$1/g) {print STDOUT "5\n"; next LINE;};
    if (s/($accountnumber)/\|$1/gi) {print STDOUT "6\n"; next LINE;};
    if (s/($name)/\|$1/gi) {print STDOUT "7\n"; next LINE;};
    print;  
}
print "\n\ndone"

変数を 1 つずつ削除して、誤動作の原因となっている変数を確認しようとしましたが、まだうまくいきません。while ステートメントも使用しましたが、処理が遅く、ファイルの最初の行が削除されます。

どんな助けでも素晴らしいでしょう。

4

2 に答える 2

4

編集: 宣言されていない変数があることに注意してください。$CUSIPこれを混同しているようです$CODE。なしstrictwarningsオンにすると、このエラーは静かで致命的ですが、入力全体にパイプ記号が挿入されるため、ほとんど目立たなくなります。

私は大雑把な推測をして、それはあなたが定義していないラベルを使用しようとしているからだと言います: LINE. このラベルは次のように使用されます。

LINE: while (<>) {

    ... next LINE;
}

しかし、簡単にそれをスキップしnextて、最も内側のループを参照する と言うことができます。ただし、ラベルがない場合、私のテストで発生しているように見えるのは、単にエラーでループを終了することです

Label not found for "next LINE" at ...

warningsがオフの場合でも、このエラーが表示されます。それは決してあるべきではありません。スクリプトの最初の 2 行は次のようになります。

use strict;
use warnings;

それはあなたの人生をずっと楽にするからです。

また、先読みアサーションを使用して、何をしようとしているのかを解決できることも知っておく必要があります。

if (s/(?=$DESCRIPTION)/|/i) { ... }

次のことに注意してください。

print STDOUT "1\n";

-p.. and-iスイッチを介してインプレース編集を使用している場合でも、ファイルに出力されます。なんらかのフィードバックが必要な場合は、STDERR に出力できます。

print STDERR "1\n";
warn "1\n";          # same thing

s///また、演算子をまったく使用する必要はありません。行を確認してから、文字列補間を使用してパイプ記号を追加できます。

if (/$DESCRIPTION/) { $_ = "|$_" }

また、まったく使用する必要はありませんnext。単純な昔ながらのロジックを使用できます。

if (/$DESCRIPTION/) { ... }
elsif (/$PRICELINE/) { ... }

それで、あなたはそれを持っています。そして、 と を使い始めてstrictくださいwarnings

于 2013-05-21T14:21:18.080 に答える