Perl 包和模块



  • 什么是包?

    package 语句切换当前命名上下文指定的命名空间(符号表)。因此-
    • 包是驻留在其自己的名称空间中的代码的集合。
    • 名称空间是唯一变量名称的命名集合(也称为符号表)。
    • 命名空间可防止程序包之间的变量名冲突。
    • 包使模块的构造成为可能,这些模块在使用时不会破坏模块自身命名空间之外的变量和功能。
    • 包将一直有效,直到调用另一个package语句,或者直到当前块或文件的末尾为止。
    • 您可以使用::包限定符显式引用包中的变量。
    以下是在文件中包含main和Foo软件​​包的示例。在这里,特殊变量__PACKAGE__已用于打印软件包名称。
    
    # This is main package
    $i = 1; 
    print "Package name : " , __PACKAGE__ , " $i\n"; 
    
    package Foo;
    # This is Foo package
    $i = 10; 
    print "Package name : " , __PACKAGE__ , " $i\n"; 
    
    package main;
    # This is again main package
    $i = 100; 
    print "Package name : " , __PACKAGE__ , " $i\n"; 
    print "Package name : " , __PACKAGE__ ,  " $Foo::i\n"; 
    
    1;
    
    
    尝试一下
    执行上述代码后,将产生以下结果-
    
    Package name : main 1
    Package name : Foo 10
    Package name : main 100
    Package name : main 10
    
    
  • BEGIN和END块

    您可以定义任意数量的名为BEGIN和END的代码块,分别充当构造函数和析构函数。
    
    BEGIN { ... }
    END { ... }
    BEGIN { ... }
    END { ... }
    
    
    在加载和编译perl脚本之后但在执行任何其他语句之前,将执行每个BEGIN块。每个END块都在perl解释器退出之前执行。创建Perl模块时,BEGIN和END块特别有用。
    以下示例显示其用法-
    
    package Foo;
    print "Begin and Block Demo\n";
    
    BEGIN { 
       print "This is BEGIN Block\n" 
    }
    
    END { 
       print "This is END Block\n" 
    }
    
    1;
    
    
    尝试一下
    执行上述代码后,将产生以下结果-
    
    This is BEGIN Block
    Begin and Block Demo
    This is END Block
    
    
  • 什么是Perl模块?

    Perl模块是在库文件中定义的可重用软件包,该文件的名称与扩展名为.pm的软件包的名称相同。一个名为Foo.pm的 Perl模块文件可能包含这样的语句。
    
    package Foo;
    sub bar { 
       print "Hello $_[0]\n" 
    }
    
    sub blat { 
       print "World $_[0]\n" 
    }
    1;
    
    
    关于Perl模块的几点要点
    • 需要和使用的功能将加载模块。
    • 两者都使用@INC中的搜索路径列表来查找模块。
    • 这两个函数都需要并使用调用eval函数来处理代码。
    • 1; 在底部导致eval评估为TRUE(因此不会失败)。
  • require 函数

    可以通过调用require函数来加载模块,如下所示:
    
    
    require Foo;
    
    Foo::bar( "a" );
    Foo::blat( "b" );
    
    
    您必须已经注意到,子例程名称必须完全合格才能调用它们。最好将子例程bar和blat导入到我们自己的命名空间中,这样我们就不必使用Foo::限定符。
  • use 函数

    可以通过调用use函数来加载模块。
    
    use Foo;
    
    bar( "a" );
    blat( "b" );
    
    
    注意,我们不必完全限定包的函数名。如果在模块内添加了一些声明,则use 函数将从模块中导出符号列表。
    
    require Exporter;
    @ISA = qw(Exporter);
    
    
    然后,通过填充名为@EXPORT的列表变量来提供符号列表(标量,列表,哈希,子例程等):例如-
    
    package Module;
    
    require Exporter;
    @ISA = qw(Exporter);
    @EXPORT = qw(bar blat);
    
    sub bar { print "Hello $_[0]\n" }
    sub blat { print "World $_[0]\n" }
    sub splat { print "Not $_[0]\n" }  # Not exported!
    
    1;
    
    
  • 创建Perl模块树

    准备好交付Perl模块时,可以使用标准方法来创建Perl模块树。这是使用h2xs实用程序完成的。该实用程序与Perl一起提供。这是使用h2xs的语法-
    
    $h2xs -AX -n  ModuleName
    
    
    例如,如果您的模块在Person.pm文件中可用,则只需发出以下命令-
    
    $h2xs -AX -n Person
    
    
    这将产生以下结果-
    
    Writing Person/lib/Person.pm
    Writing Person/Makefile.PL
    Writing Person/README
    Writing Person/t/Person.t
    Writing Person/Changes
    Writing Person/MANIFEST
    
    
    这是这些选项的描述-
    • -A - 省略了Autoloader代码(由定义大量不常用子例程的模块最佳使用)。
    • -X - 省略XS元素(eXternal子例程,其中eXternal表示Perl外部,即C)。
    • -n - 指定模块的名称。
    因此,以上命令在Person目录中创建以下结构。实际结果如上所示。
    • Changes
    • Makefile.PL
    • MANIFEST(包含软件包中所有文件的列表)
    • README
    • t/(测试文件)
    • lib/(实际的源代码在这里)
    因此,最后,您可以将此目录结构压缩到一个Person.tar.gz文件中,然后可以进行运输。您将必须按照正确的说明更新自述文件。您还可以在t目录中提供一些测试示例文件。
  • 安装Perl模块

    以tar.gz文件的形式下载Perl模块。按照以下顺序安装任何已作为Person.tar.gz文件下载的Perl模块Person.pm。
    
    tar xvfz Person.tar.gz
    cd Person
    perl Makefile.PL
    make
    make install
    
    
    Perl解释器有一个目录列表,它在其中搜索模块(全局数组@INC)。