2009-04 << 2009-05 >> 2009-06

2009-05-18 (月)

*Perlから「$」を駆逐するモジュール

以前,Perlのドル記号をどうにかしようとして上手くいかなかったのですが,BEGINブロックでサブルーチンを作ったらいいんじゃないか?というアイディアが浮かんだ.コンパイル時に変数名からサブルーチンを動的に作って,宣言したい場所の名前空間に放り込んでしまえばいいはず.

宣言するごとにBEGINブロックを書くのは嫌なので,どうにか動的に生成したい.しかし,BEGINブロックはコンパイル時に実行されているので,そこに処理が到達したときには手遅れになる.

BEGINブロックを直接記述せずに,コンパイル時に変数名によってパラメタライズされた処理を実行できれば問題が解決する.

…これは明らかにあれです.

package var;
sub import {
    shift;
    for (@_) {
        my $t=$_;
        *{caller()."::$t"} = sub :lvalue{${$t}};
    }
}
1;

こういうモジュールを作って,

use var test,a;
test="hello\n";
a=123;
print test;
print a."\n";

としてみる.

%perl test.pl
hello
123

できた!Perlスクリプトから「$」を消すモジュール.

次はuse無しでいきたいなぁ.せめてlocal相当にしたい.

ただ,これによってPerlの処理系以外にPerlスクリプトのパーサが存在しないことが分かってしまった.