2011-05-13 11 views
1

フラットファイルの一部のデータ要素を変換するコードがあります。私はold:新しい値を処理の最後にファイルに書き込まれるハッシュに保存します。サブシーケンスの実行時に、私はハッシュにリロードするので、以前に変換された値を追加のデータファイルに再利用することができます。最後のコンバージョン値も保存します。コンバートされていない値がある場合は、新しいコンバート値を割り当ててハッシュに追加できます。文字列のPerl自動インクリメントが以前と同じように動作しない

6つのファイルで問題なくこのコードを使用しました(2月に戻る)。私はZCKL0(最後の文字はゼロ)に設定されている変数を持っています。この変数は最後に使用された値を保持しているファイルから取り出されます。増分演算子を適用します。 ... $ data {$ olddata} = ++ $ dataseed; ... $ dataseedの結果の値はZCKL1の代わりに1です。元の開始シード値はZAAA0でした。

私はここで何が欠けていますか?

答えて

6

コードの数値コンテキストで$dataseed変数を使用していますか? perlopから

あなたは 数値である、またはそれは、これまで で数値コンテキストを使用されている変数をインクリメントする場合は、通常の 増分を取得します。ただし、変数 が文字列コンテキスト で使用されていて、設定されているため、 が空の文字列ではなく、 パターン/^[a-zA-Z] [0-9 ] \ z /の場合、 の文字列は の範囲内に保持され、文字列として の文字列としてインクリメントされます。

+3

++良い候補は、eq、lt、geなどの代わりに==、<, > =のような数値演算子を使った比較です。 –

0

文字列の++は、文字列の内容と文字列が使用されているコンテキストに基づいて異なる動作をする点で「魔法」です。次いで

print ++$s; 

が印刷され

my $s='ZCL0'; 

は問題と仮定を説明するために

ZCL1 

$s+=0; print ++$s; 

0123ながら枚の

プリント

1 

NB:他の一般的なプログラミング言語では、++は数値のみのために合法です。

Perlの非直感的な "マジック"機能を使用すると、混乱している可能性があり、サポートできないコードにつながる可能性があるため、使用しないでください。

+3

*直感的な*≡* familiar *≡*以前に遭遇した* – tchrist

+0

右!他のプログラミング言語に慣れていれば、文字列の++は直感的ではありません。 ;) –

+0

あなたはそれに精通していないので、彼はalpha ++を再実装することを提案していますか? – ikegami

0

あなたは魔法++動作に依存することなく、ほぼ同じ簡潔に書くことができます。

s/(\d+)$/ $1 + 1 /e 

eフラグは表現の置換なります。

+1

彼はまた文字を増分しています。 ZAAA0はZCKL0になりました – ikegami

+0

上記の問題は解決しません。池上が指摘したように、OPにも手紙を書く必要があります。 –

関連する問題