Perl:使用Module @list
有人在使用函数语句中有一个想法使用数组变量代替数组(列表)文字,如:
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,%dn",PF_INET,PF_INET6; 看似按预期工作:
然后,她正在使用其他模块,例如时间::高分辨率.代替 use Time::HiRes qw(CLOCK_REALTIME CLOCK_MONOTONIC); printf "%d,CLOCK_REALTIME,CLOCK_MONOTONIC;
她这样做: my @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC); use Time::HiRes @consts; printf "%d,0 解决方法
这与代码执行时有关. use在编译时执行,而my @list只在运行时执行.因此,数组不存在加载模块的点.
模块Socket exports PF_INET和PF_INET6默认情况下,因此如果将其放入使用行中则无关紧要.但是Time :: HiRes does not export stuff默认情况下. 你严格得到的错误是:
这告诉我们Perl不知道CLOCK_REALTIME是一个sub,这是真的,因为当我们这样做时它没有被加载: my @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC); use Time::HiRes @consts; printf "%d,CLOCK_MONOTONIC; What BEGIN { require foo; foo->import(); } 知道了,我们可以自己做: use strict; use warnings; BEGIN { my @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC); require Time::HiRes; Time::HiRes->import(@consts); } printf "%d,CLOCK_MONOTONIC; __END__ 0,1 像这样它可以工作,因为数组@const在相同的范围内定义,并且在Perl解释器执行它时已经可用. 由于范围界定,只需在使用前添加BEGIN块就行不通. BEGIN { my @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC); } use Time::HiRes (@consts); 您可以通过在BEGIN块之外声明变量来解决问题.这样它将在下一个BEGIN块的范围内可用,并且因为 my @consts; BEGIN { @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC); } use Time::HiRes (@consts); printf "%d,1 所以回顾一下: >这是因为两件事:范围和执行顺序 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |