パブリック変数地獄
いま職場でとあるシステムのプログラム説明書を書いているのですが、そのシステム、パブリック変数しかないんですよね…。
おかげでモジュール間の参照関係とか全然読めない。
変数もどこが宣言で、どこが定義で、どこが参照だか、さーっぱりわかんない。
そんな地獄から抜け出すための取っ掛かりにと、急ぎやっつけたソースコードです。
ソースコードファイルを指定すると、変数、配列、ハッシュと思しき内容を引っこ抜きます。
my $file_name = '変数ぶっこ抜きたいPerlソースコード';
open(FILE, $file_name) or die "$!"; # ファイル開く
# 変数ぶっこ抜き
my @vals = (); # 変数格納用配列
while(my $line = ){ # ソースコードを1行ずつ読み込み
@vals = (@vals,&sampling_vals($line)); # 関数sampling_valsで変数を配列に格納
}
close(FILE); # ファイル閉じる
# 重複除去
# (同じkey値を持つハッシュは上書きされる仕組みを利用する)
my %hash = (); # 重複除去用ハッシュ
foreach my $v( @vals ){ # 配列@vals内の値を全件走査
$hash{$v} = 1; # 配列@valsから取得した値をkeyにしてハッシュにてきとーな値を格納
}
# ハッシュからキー(@valsから放り込んだ値=変数)を取出し
my @keys = keys(%hash); # ハッシュ%hashから全キーを配列@keysに格納
@keys = sort(@keys); # キーを名前順にソート
foreach $key( @keys ){ # 配列@keys内の値を全件走査
print "$keyn"; # キー(変数)をプリント
}
# 変数抜き取り関数
sub sampling_vals(){
my $line = $_[0]; # 引数からソースコードの行データを受取
# split関数を使ってソースコードをバラす
my @words = split(/=|+|-|/|s|(|)|{|}|<|>|[|]|.|,|'|"|\|;|?|||&/,$line);
my @array = (); # バラした文字列を格納する配列
foreach my $word( @words ){ # 配列@array内の値を全件走査
# 正規表現を利用して変数だけ選別
if ( $word =~ /^$.+?|^@.+?|^%.+?/ ){ # 変数の書式($、@、%、で始まる文字列)にマッチするか否か
push @array, $word; # 配列@arrayに変数$wordを格納
}
}
return @array; # 変数を格納した配列@arrayを返す
}
課題
面倒だったので見送った課題幾つか。
- 変数が連続した文字列展開から引っこ抜けない
- マルチバイト文字込みの文字列展開から引っこ抜けない
- 普通の変数と、配列・ハッシュの要素参照変数の区別ができない
このあたりは、また折を見て手直しを入れたいところ。
あと、正規表現とかもぐだぐだなので、もっと綺麗にしたい。
つか、そもそもCPAN探せば、まんま使えるモジュールとか見つかりそう。orz
誰か良いモジュール知っていたら教えて下さい。
参考