Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl记录哪些脚本/模块访问另一个模块_Perl - Fatal编程技术网

Perl记录哪些脚本/模块访问另一个模块

Perl记录哪些脚本/模块访问另一个模块,perl,Perl,我们维护了大量的perl模块,实际上它是如此巨大,以至于我们甚至不知道我们负责的所有模块。我们希望在某种日志中跟踪哪些脚本和模块访问另一个模块,最好按模块名称存储,这样我们就可以评估更新模块是否有风险,从而知道我们可能会影响什么 有什么简单的方法可以做到这一点吗?您可以进行简单的正则表达式搜索: use strict; use warnings; my %modules; foreach my $perl_file (@file_list) { open FILE, $perl_f

我们维护了大量的perl模块,实际上它是如此巨大,以至于我们甚至不知道我们负责的所有模块。我们希望在某种日志中跟踪哪些脚本和模块访问另一个模块,最好按模块名称存储,这样我们就可以评估更新模块是否有风险,从而知道我们可能会影响什么


有什么简单的方法可以做到这一点吗?

您可以进行简单的正则表达式搜索:

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}++;
        }
    }
}

不过,由于调用脚本的方法已经改变,您可能会面临有趣的副作用的风险。这取决于您正在做什么。

也许可以编辑sitecustomize.pl,这样每当Perl运行时,它都会在日志中写入一些信息,然后对其进行分析?向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;
open(LOG,'>>,“absolutepathto/logfile.txt”);
打印日志$0、“\t”、$$、“\t”、标量(本地时间)、“\n”;
开放式自助,0美元;
而(){
打印日志$uuIf(/use | require/);
}
自我封闭;
打印日志“\ux”80“\n”;
闭合日志;
编辑: 此外,我们忘记了%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;
}
open(LOG,'>>,“absolutepathto/logfile.txt”);
打印日志$0,,$$,'',标量(本地时间),“\n”;
开放式自助,0美元;
而(){
打印日志$uuIf(/use | require/);
}
自我封闭;
结束{
本地$“=”\n”;
打印日志“此程序运行结束时使用、评估或do函数加载的文件:\n”;
打印日志“@{[values%INC]}”,“\n”;
打印日志“\ux”80“\n”;
闭合日志;
}

我认为这需要很长的时间。我更喜欢模块内部的代码,它可以告诉我访问的位置,最好是何时访问。然后我可以将该代码添加到我想要监控的模块中。这可能吗?@PabloKarlsson,我建议不要编辑所有模块。那么升级模块时会发生什么?注册表ex应该很快,但如果您真的想在运行时记录它,我添加了另一种方法。您可能可以通过
%main::
将其从
%main::
中删除,如果使用简单的正则表达式搜索,那么为什么要在运行时执行呢?如果您有经常调用的脚本(例如,CGI脚本),这将大大降低速度。sitecustomize.pl是一个不错的技巧,我没有这样做但是,要知道。显然,不要让它永远存在——直到你有足够的关于哪些脚本被调用以及它们使用哪些模块的信息。这样你就可以避免对很多脚本进行编校,最终可能会很糟糕。我们可以在不使用正则表达式的情况下打印完整的内容,然后稍后再对其进行解析。我可能会尝试这样做,然后将返回。@PabloKarlsson,正则表达式与文件i/o相比将非常快。在运行时进行一些分析不会有什么坏处;它甚至可能比复制整个文件还要快。为什么不只存储运行的脚本的名称(
$0
)?然后你可以稍后回来打开文件并解析它。这是一个好主意..我真的需要知道什么脚本在一周左右的时间里使用了一个模块。
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;
}