【发布时间】:2018-09-19 10:58:11
【问题描述】:
有人想在use 函数语句中使用数组变量代替数组(列表)字面量,例如:
my @list = qw(foo zoo);
use Module @list;
而不是
use Module qw(foo zoo);
所以她写了例如:
my @consts = qw(PF_INET PF_INET6);
use Socket @consts;
printf "%d, %d\n", PF_INET, PF_INET6;
这似乎按预期工作:
2、10
然后她正在使用其他一些模块,例如Time::HiRes。而不是
use Time::HiRes qw(CLOCK_REALTIME CLOCK_MONOTONIC);
printf "%d, %d\n", CLOCK_REALTIME, CLOCK_MONOTONIC;
0, 1
她做到了:
my @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC);
use Time::HiRes @consts;
printf "%d, %d\n", CLOCK_REALTIME, CLOCK_MONOTONIC;
0, 0
它突然不起作用,就像它与 Socket 模块一样!
这里发生了一些不好的事情。
(.. 这是在非严格的环境中。如果她使用use strict,她甚至会得到一个错误。另一方面,在她的第一个看似有效的例子中,她根本没有得到任何暗示——即使她已经use strict; use warnings; use diagnostics 那里。)
现在她想探索这种奇怪的行为。尝试导入一个空列表:
my @consts = ();
use Socket @consts;
printf "%d, %d\n", PF_INET, PF_INET6;
2、10
出人意料地也有效,虽然它可能不应该,例如:
use Socket ();
printf "%d, %d\n", PF_INET, PF_INET6;
0, 0
然后她稍微深入研究了这些模块并意识到这两个模块之间的区别在于这些常量分别是/不是@EXPORTed。
她的结论是use Module @list 没有按她的预期工作。
对此最好的解释是什么?她做错了什么 - 在use 语句中使用预定义数组的正确方法是什么?
【问题讨论】:
-
Re“尝试导入一个空列表......令人惊讶的效果也很好”,为什么?
use foo @foo;与use foo;没有什么不同。两者都提供一个空列表。use foo ();也会传递一个空列表,但它是一个特殊的语法。
标签: perl perl-module