Perl库的用法

时间:2015-07-09 23:40:19

标签: perl

与在条件顶部添加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
}

2 个答案:

答案 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表达式是在编译时执行的,因此它所依赖的所有内容在编译时也必须是已知的并且可用。