あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

Yacafiの動作を読み解く3

http://d.hatena.ne.jp/hao_yayoi/20100827/1282843571:titlle=Yacafiの動作を読み解く2より引き続き

86 〜 95行目

 86     $yacafi =~ s/### NO PACK\n.+?### NO PACK END\n//sg;
 87     $yacafi =~ s/\n__END__\n.+$//s;
 88     $yacafi =~ s/'\.\$CURRENT_CLASS\.'/$CURRENT_CLASS/g;
 89     $yacafi =~ s/\$CURRENT_CLASS/$CURRENT_CLASS/g;
 90 
 91     my $global = '';
 92     for my $code ( $yacafi =~ /### GLOBAL\n(.+?)### GLOBAL END\n/sg ) {
 93         $global .= $code;
 94     }
 95     $yacafi =~ s/### GLOBAL\n(.+?)### GLOBAL END\n//sg;

引き続きYacafi.pmのソースコードを置換する処理。Yacafi.pmの中身の殆どがメタプログラミングのためのものというのがよくわかる。

97 〜 104 行目

 97     my $cgi = _read_file( ( caller(1) )[1] );
 98     $cgi =~ s/use (?:Yacafi|strict|warnings).*?;\n//sg;
 99     $cgi =~ s/\$Yacafi::/\$/g;
100 
101     my $shebang;
102     if ( $cgi =~ s/(\#\![^\n]+)//s ) {
103         $shebang = $1;
104     }

今度は、use Yacafiで実際に書いていたソースコードを対象にした置換作業。98行目でuseしてた行を消し、99行目でYacafiグローバル変数名から名前空間部分を消す。102行目にてシェバン(UNIXスクリプトの#!から始まる1行目)があればそれを変数に保持。

次はtemplate_builderなんだけど、多分これが一番手が込んでる感じなので、とりあえずここまで。