2006.07.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2006.07.01)

$ [Perl] フックだ、チョップだ、二重定義だ

(2006.06.21) に、型ブログを使えば、 拡張のためのフックなんて作らなくてもいいと 書いたんだけれども、-w オプションを付けると、 二重定義エラーになってしまうことが判明した。

Perl クックブック Vol.1 によると

  undef &grow;
  *grow = \&expand;

とすればいいそうだ。 だが、これをやると、

  my $org_grow=\&grow;
  undef &grow;
  *grow = sub {
      # いろんな処理
      $org_grow->(@_);
  };

なんてことが出来ない。 自分自身を呼び出して、無限ループになってしまうのだ。 undef を使わなければ、ちゃんと旧&grow を呼び出してくれるのだが。

で、いろいろ試してみた結果:

  (*grow,*org_grow)=(*new_grow,*grow);
  
  sub new_grow{
      # いろんな処理
      &org_grow(@_);
  }

と、シンボルだけ入れ変えるようにしてやればよいようだ。 これだと -w でも警告は出ないし、無限ループにもならない。 見かけ、そんなトリッキーでもない(ように見える)。

でも、ほんとにいいんかな、これ。いや、ちゃんと機能してるんだけどね。

$ やっぱり awk っていいよな

うちの C/S システムは通信ログを

#### 2006/06/21 11:21:30 << [プロセスID] プログラム名
受信内容
    :(数行:行数不定)
#### 2006/06/21 11:21:32 >> [プロセスID] プログラム名
送信内容
    :(数行:行数不定)

てな感じで書いてた。これを解析するのに今まで、 Perl で作った解析スクリプトのテンプレートを、 どうのこうのしていたんだけれども、 よくよく考えれば、

   gawk -v RS="\n####" -v FS="\n" '{…}'

とすれば、1電文全体(ただし片側)が $0 に、各行が $n 、 行数が NF に入るため、非常に簡単に扱えるではないですか。 そんなことに気付いて…

ひとり感動した

やはり、awk の真髄は、特殊変数か! (ちなみに Perl でも $/ とかあるのは知ってますよん)。

だが職場で、この喜びを共有できない寂しさはいったいなんだ (さすが、人気度最低ランクなだけはある)

しかし、こうなってくると、やはり Oracle との連携が無いのが痛すぎる。 getline みたいに、SQL が発行できたらなぁ。ほらほら、こんな感じ

   sql="select foo,bar,par from t_hoge"
   while( (execsql sql) > 0 ){
        # $1,$2,$3 に foo とか par とか bar とか
        # が入るイメージ。
   }
   close(sql)

xgawk は、PostgreSQL と連携できるという噂だが、 どんなインターフェイスなのだろう。 暇な時にでも調べてみよう(←永遠に暇にならない奴)

.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー