memo517 : Xref

Created Tue Dec 25 20:16:50 2012
Last Modified Tue Dec 25 20:23:04 2012

*#1 Tue Dec 25 20:16:50 2012 / Tue Dec 25 20:23:04 2012

・PerlのXrefについて

$ perl -MO=Xref [perl code]
などとすると、当該コードの"クロスリファレンス"レポートが生成される。
これは、コード内の変数・サブルーチンがどこで定義され、どこで使われているのかを
網羅的に調べ、まとめたもの。

-rオブションを加えると、機械加工しやすい形で出力してくれる。
$ perl -MO=Xref,-r [perl code]

個人的には今のところ次の用途で使う:
(1)定義しただけで使われていないローカル変数の検出
(2)同じ名前だがシンボルが異なるローカル変数の検出
(3)同じサブルーチン内で多重定義されているローカル変数の検出

(1)に関してはかなり精度が良い。
しかし(3)についてはちょっと難アリ。
(3)で検出したいのは、例えば以下のような状況。
------------------
#親子関係にあるスコープにおいて名前がかぶっている。
my $t;
{
    my $t;
}
------------------

しかし、Xrefの出力上、これは下記のような状況と区別ができない?
------------------
#親子関係に無いスコープにおいて名前がかぶっている。
{
    my $t;
}
{
    my $t;
}
------------------

勉強不足なのかも。



また、場合によっては致命的な弱点となるが、Xrefは静的解析を行うため、
クロージャ等の動的なコードには対応できない事に気をつける必要がある。


あと、-Wが使えるならそっちの方が簡単かも・・・



*Linked from: