与在条件顶部添加use mylibrary
相比,有条件地包括mylibrary
(假设use mylibrary
仅在条件为真时使用时)是否有任何好处(wrt性能/内存使用)无条件?
# Script 1 (Unconditional use)
use mylibrary;
if($condition)
{
# Do something with mylibrary
}
# Script 2 (Conditional use)
if($condition)
{
use mylibrary;
# Do something with mylibrary
}
答案 0 :(得分:7)
use
是一个编译时构造。在您的两种情况下,mylibrary
实际上是在您的"无条件"和"有条件的"案例。如果要有条件地导入库,请改用运行时构造require
。
if ($condition) {
require mylibrary;
# mylibrary->import;
# ...
}
在这种情况下,您会失去use
的一些编译时优势。例如,require
在编译时不会调用mylibrary->import
,因为use
会调用import
。如上所示,您可以根据需要自己调用import
,但是在编译时生效的任何mylibrary
在运行时调用时都不会产生这种效果。
假设您的模块foo
导出函数use strict;
use mylibrary; # exports function foo()
foo;
。然后这工作:
use strict;
require mylibrary;
mylibrary->import; # too late to notify Perl's parser about the foo() function
foo; # error; unknown function
但这是一个错误:
mylibrary
至于这样做是否有任何好处,如果data = [(0, 2.5), (1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]
n = 5
t0, x0 = data.pop(0)
outliers = []
up = bool(x0 > 0)
for t, x in data:
if (x < x0 and up) or (x > x0 and not up):
if not outliers:
outliers = [(t0,x0)]
outliers.append((t,x))
up = not up
else:
if len(outliers) >= n:
print 'outliers =', outliers
outliers = []
t0,x0 = t,x
if len(outliers) >= n:
print 'outliers =', outliers
导入成本很高。大部分时间,可能不是。
答案 1 :(得分:0)
您可以使用use
编译指示实现条件加载,包括if
(调用 - &gt;导入和编译时执行)的附带好处:http://perldoc.perl.org/if.html < / p>
use if $Config{usethreads}, 'Library::Requiring::Threads';
当然,有一点需要注意,if
表达式是在编译时执行的,因此它所依赖的所有内容在编译时也必须是已知的并且可用。