加载 perl 模块时只调用一次 srand

Call srand only once when loading perl modules

我的脚本被分成多个包。 main.pl 加载 A.pm,后者加载 A::B.pmA::C.pm。他们都使用rand。但是,如果我在 main.pl 中为 srand 指定一个种子,后面的模块似乎无论如何都会生成它们自己的种子。我怎样才能只为 RNG 播种一次并使整个脚本可预测?

在加载 A 之前,将 srand 放入 main.plBEGIN 块中:

use strict;
use warnings;
...

BEGIN { srand(7) }
use A;
...

一个完整的例子:

A.pm:

package A;

use B;
use C;

CORE::say "A: ", rand();

B.pm:

package B;

CORE::say "B: ", rand();

C.pm:

package C;

CORE::say "C: ", rand();

main.pl:

BEGIN { srand(7) }

use A;

CORE::say "main: ", rand();

运行 perl -I . main.pl 总是打印:

B: 0.266444196765409
C: 0.682035230190621
A: 0.265490593427
main: 0.129110848853948

如果我把 srand(7) 放在 use A 之后,那么前三个印刷品(来自 ABC)是随机的,并且只有main.pl 中的那个总是相同的。