2011-04-26(火)晴れ
「HP200LXで家計簿」、 「AWKとPerlでスクリプト」」ということで、家計簿データ処理用のスクリプトをAWKとPerlで作成してきました。ある程度使えるようになると、AWKやPerlは便利です。演算ができるので、応用範囲が広いですね。テキスト処理だけであればSEDで充分ですが、、。SED、AWK、Perl、、やはり一長一短の部分もあり、各々に向いた処理というのがあるような気がします。
1.感想
さて、今回使ったAWKとPerlですが、単純に入力ファイルを行毎に処理するとしたら、AWKの方が簡単な気がします。入力取り込みを自分で考える必要がないからです。取り込んだ行データの中のフィールドセパレータ(フィールドの区切り文字)の指定も簡単です。
Perlは、自分でファイルオープンまでやったりして面倒ですが、その分自由度は高いかもしれません。
また、Perlが持っている関数機能(サブルーチン機能)は便利で、今回もステップ数を減らすのには効果的でした。
2.間違いやすい点など
Perlだけ使っていると問題ないけど、AWKも使ったりしていると、ついやってしまうミスがあります。
(1)行末のセミコロンを忘れる。
(2)変数名を間違える。即ち、AWKは名前だけでよいけど、Perlは変数名
の前に$や@を付けないといけない。付けてなくてもエラーが出ないけど
結果出力は正しくならない。
・スカラー変数は$を付ける(例:$WK)
・配列自身は@を付ける(例:@ARY)、でも配列の一つ一つを記述する
ときは$を付ける(例 $ARY[$i])。
結構、混乱しました。
(3)十進整数にはシングルとダブル(ロングというのかな)があるのを忘れる。
この(3)には、はまりました。フォーマットを揃えて(桁数を揃えて)出力するときにprintf(或いはsprintf)を使用するのですが、AWKで作成したときは、金額の合計値を表示させるのに
printf ("%7d %7d \n", $Ginkei ,$Goukei);
でうまく行きました(%7d 即ち7桁の十進整数指定)。で、そのままの頭でPerlを使ったら、、、動かないのです。結果数字が合わないんです。表示したい変数の中身(合計値)が小さくなったりマイナスになったり、、。
色々な数値をいれて表示させてみて気がつきました。32767とか65535を越えるとおかしくなることから、やっと気がつきました。2バイト(2進で16ビット)数字として処理されているわけです。65535を越えると、0からに戻るわけです。
マニュアルを見たら、、ちゃんとロング(指定をldで行う)がありました。
printf ("%7ld %7ld \n", $Ginkei ,$Goukei);
でうまく行きました。なお、print分では、どちらでも正しく表示されました(桁数は合わせられないけど)。
もう一つの考え方は、画面表示は文字列なんだから、文字列指定の「s」を使うのが良いかもしれません。
printf ("%7s %7s \n", $Ginkei ,$Goukei);
だと、AWKでもPerlでも正しく表示されました。print文と同じように、数字を文字列にして表示してくれるからかもしれません。
数値を、色々なフォーマット指定で表示させてみました。
下の画像はAWKの例です。赤で囲んだところも正しく表示されています。
下の画像はPerlの例です。赤く囲んだ部分の数値が小さくなっています。2バイトを越えるビット部分が切り落とされた数値になります。
下の画像はPerlの例です。赤枠の部分(d指定)はおかしくなっているけど、緑枠(ld指定)は正しくなっています。
なかなか、勉強になりました。
最近のコメント