1

共通の構成を持つ小さな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 { ... }

しかし、次は何ですか?use MyConfigまた?怒っているように見えます。

私のスクリプトは、5.8から最新までの多くの異なるプラットフォームと異なるperlバージョンで実行する必要があるため、CPANモジュールを避けようとしています。

このタスクについての良い解決策を教えてください。

4

1 に答える 1

2

あなたがuse Module (ARGS)、これはと同等です

BEGIN {
  require Module;
  Module->import(ARGS);
}

モジュールを見つけてrequireコンパイルします。これは、モジュールごとに1回だけ発生します。は、通常、サブと変数を呼び出し元の名前空間(Exporterモジュールによって提供される)にロードimportする特別なサブを実行します。importそれで

$SIG{USR1} = sub { no warnings 'redefine'; MyConfig->import };

あなたの問題のために非常にうまくいくかもしれません。


ファローアップ:

これが機能することを示すために、この小さなプログラムを作成しました(USR1の代わりにALRMを使用)。

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

出力:0からおよそ10まで何度も数えます。ループ内で変数を変更していることに注意してください。これにより、変数が変更され、正しくリセットされていることがわかります。

于 2013-02-08T06:57:40.297 に答える