4

私たちは膨大な数の perl モジュールを維持していますが、実際にはあまりにも巨大なので、私たちが担当しているすべてのモジュールを把握することさえできません。モジュールを更新するリスクがあるかどうかを評価し、何に影響するかを知ることができるように、できればモジュール名で保存された何らかのログで、どのスクリプトとモジュールが別のモジュールにアクセスするかを追跡したいと考えています。

これを行う簡単な方法はありますか?

4

2 に答える 2

3

簡単な正規表現検索を実行できます。

use strict;
use warnings;

my %modules;

foreach my $perl_file (@file_list) {

    open FILE, $perl_file or die "Can't open $perl_file ($!)";
    while (<FILE>) {

        if (/\s*(?:use|require)\s*([^;]+);/) {

            $modules{$1}{$perl_file}++;
        }
    }
}

これは手早く汚いですが、かなりうまくいくはずです。最終的にモジュールのハッシュになり、それぞれがそれを使用するファイルのハッシュを指します。

もちろん、それは次のようなものをキャッチしますuse strict;が、それらは無視するのに十分簡単です。

次のようなものがある場合はuse Module qw/function/;、セミコロンの前のすべてを取得しますが、大したことではありません。既知のモジュール名のキーを検索するだけです。

欠点は、依存関係を追跡しないことです。その情報が必要な場合は、cpan などから取得して追加できます。

更新:実行時にこれをログに記録する場合は、ラッパー スクリプトを作成し、perlコマンドがシステム上のラッパーを指すようにすることができます。次に、ラッパーを次のようにします。

use strict;
use warnings;

use Module::Loaded;

my $script = shift @ARGV;
#run program
do $script;

#is_loaded() gets the path of these modules if they are loaded.
print is_loaded('Some::Module');
print is_loaded('Another::Module');

ただし、スクリプトを呼び出す方法が変更されたため、おかしな副作用が発生する可能性があります。それはあなたが何をしているかによります。

于 2012-10-25T09:04:05.283 に答える
1

Perl が実行されるたびにログに情報を書き込み、それを分析するように、sitecustomize.pl を編集することはできますか? 次のようなものを sitecustomize.pl に追加します。

open (LOG, '>>',"absolutepathto/logfile.txt");
print LOG $0,"\t",$$,"\t",scalar(localtime),"\n";
open SELF, $0;
while (<SELF>) {
print LOG $_ if (/use|require/);
}
close SELF;
print LOG "_" x 80,"\n";
close LOG;

編集: また、%INC ハッシュを忘れていたので、上記のコードを次のように書き直して、実際にロードされたモジュールに関するデータを追加し、do 関数に必要なファイルを含めます。

open (LOG, '>>',"absolutepathto/logfile.txt");
print LOG $0,' ',$$,' ',scalar(localtime),"\n";
open SELF, $0;
while (<SELF>) {
print LOG $_ if (/use|require/);
}
close SELF;
END {
local $" = "\n";
print LOG "Files loaded by use, eval, or do functions at the end of this program run:\n";
print LOG "@{[values %INC]}","\n";
print LOG "_" x 80,"\n";
close LOG;
}
于 2012-10-25T10:01:26.217 に答える