为perl脚本共享可重新加载的配置参数的好方法是什么

为perl脚本共享可重新加载的配置参数的好方法是什么,perl,configuration,import,daemon,signal-handling,Perl,Configuration,Import,Daemon,Signal Handling,我有许多具有公共配置的小型Perl守护进程 目前,我使用它来加载设置: 在myconfig.pm中: package MyConfig; use base 'Exporter'; BEGIN { our @EXPORT = qw( $DB_DSN $DB_USER $DB_PWD ); } our @EXPORT; use vars @EXPORT; $DB_DSN = "DBI:mysql:..."; $DB_USER = 'asdad'; ... 在daemon.pl中: u

我有许多具有公共配置的小型Perl守护进程

目前,我使用它来加载设置:

在myconfig.pm中:

package MyConfig;
use base 'Exporter';

BEGIN {
    our @EXPORT = qw( $DB_DSN $DB_USER $DB_PWD );
}

our @EXPORT;
use vars @EXPORT;

$DB_DSN = "DBI:mysql:...";
$DB_USER = 'asdad';
...
在daemon.pl中:

use MyConfig;
这个很好用。但现在我有了一个新的要求,即在接收到
USR1
信号时重新加载配置。我知道

$SIG{"USR1"} = sub { ... }
但是接下来呢<代码>再次使用MyConfig?看起来很疯狂

我的脚本必须运行在从5.8到现代的许多不同平台和不同的perl版本上,所以我尽量避免使用CPAN模块

请告诉我有关此任务的好解决方案。

当您
使用模块(ARGS)
时,这相当于

BEGIN {
  require Module;
  Module->import(ARGS);
}
require
定位并编译模块。对于每个模块,这种情况只发生一次。
import
运行特殊的
import
sub,通常将sub和变量加载到调用者名称空间(由导出器模块提供)。所以

也许对你的问题很有效


后续行动: 我编写了这个小程序来证明这是可行的(使用ALRM而不是USR1):


输出:一次又一次地从0数到大约10。请注意,我更改了循环中的变量,这样我就可以看到它的更改并正确重置。

非常感谢您编辑我的问题。我的英语不好。但是这个解决方案不起作用。这里列出并记录@KorjavinIvan您的要点并不能证明它不起作用-您永远不会更改变量,这样就可以查看重置。另外,
vars
pragma也不推荐使用:
our
提供所有功能。试试我添加的代码,看看它是否有效。我用编辑器更改了MyConfig.pm,然后发送kill-USR1。但是reloadded.pl仍然打印旧值。我修改了我的要点,从代码中添加了报警,并从MyConfig.pm文件中添加了证明。gist.github.com/korjavin/4737335@KorjavinIvan啊,现在我明白你的问题了。如上所述,每个模块只编译一次。从已知模块中删除后,可以通过重新+
require
ing来强制重新编译。将处理程序更改为
delete$INC{“MyConfig.pm”};需要MyConfig;MyConfig->import
。请注意,
%INC
中的键是文件名,而不是包名。
$SIG{USR1} = sub { no warnings 'redefine'; MyConfig->import };
use 5.010;
package Foo;
sub import{ # The Exporter module writes something similar.
  no strict 'refs';
  *{caller()."::var"} = \do{ my$x = 1 }; # put $foo into callers namespace
}

package main;
Foo->import(); # use Foo; if the package were in another file
$SIG{ALRM} = sub{ Foo->import; alarm 10 };
alarm 10;
while(1){
  say $var++;
  sleep 1;
}