« 山間の風景 | トップページ | ネットワーク時刻情報による携帯電話の自動時計合わせ »

2011年4月26日 (火)

「AWKとPerlでスクリプト」AWK、Perlの感想と罠

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の例です。赤で囲んだところも正しく表示されています。

Scrn0014

 下の画像はPerlの例です。赤く囲んだ部分の数値が小さくなっています。2バイトを越えるビット部分が切り落とされた数値になります。

Scrn0015

 下の画像はPerlの例です。赤枠の部分(d指定)はおかしくなっているけど、緑枠(ld指定)は正しくなっています。

Scrn0017

 なかなか、勉強になりました。

 

|

« 山間の風景 | トップページ | ネットワーク時刻情報による携帯電話の自動時計合わせ »

PDA」カテゴリの記事

アプリケーション」カテゴリの記事

プログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/513620/51497803

この記事へのトラックバック一覧です: 「AWKとPerlでスクリプト」AWK、Perlの感想と罠:

« 山間の風景 | トップページ | ネットワーク時刻情報による携帯電話の自動時計合わせ »