Perl使用模塊和@INC

use加載模塊

安裝模塊後,都會有對應的文檔,能夠經過perldoc MODULE_NAME來獲取模塊的使用幫助。html

例如:獲取File::Utils的使用幫助。linux

perldoc File::Utils

要在perl程序中使用模塊,須要使用use來裝載(load)模塊。例如,File::Basename模塊:shell

#!/usr/bin/perl

use File::Basename;

通常來講,全部要裝載的模塊都會寫在perl程序的開頭,由於use語句是程序編譯期間執行的,並且之後要查看、修改程序中使用的模塊也方便。固然,這並不是必須,能夠在任意地方書寫use語句。函數

裝載模塊後,模塊內的屬性就會導入到當前程序的名稱空間供當前程序使用。例如,File::Basename模塊提供的兩個子程序是basename()和dirname(),他們分別獲取給定文件路徑的basename和dirname。命令行

#!/usr/bin/perl
use File::Basename;

my $basename = basename( "/usr/bin/perl" );
my $dirname = dirname( "/usr/bin/" );
print "$basename\n$dirname";

或者,只導入給定的函數:code

use File::Basename ('basename','dirname');

推薦直接用qw()列表的方式,即便只導入一個函數:orm

use File::Basename qw(basename dirname);

函數導入到當前名稱空間後,模塊中的函數可能會和當前程序文件中定義的同名子程序衝突。這時須要指定函數的全名:htm

my $dirname = File::Basename::dirname( "/usr/bin/" );

若是,導入模塊時給出一個空列表,它和不給列表是不同的。也就是說,下面兩種方式是不等價的:element

use File::Basename;
use File::Basename ();

前者表示導入模塊的默認屬性,包括一些默認函數。然後者表示什麼都不導入,這時若是要使用這個模塊中的函數,只能使用全名。文檔

另外,有些模塊比較複雜,函數、屬性、方法比較多,通常這時候會提供標籤分組功能,其實它們是一堆函數集合。這樣能夠在導入的時候按照分組標籤來導入。常見的一個標籤是:all,它表示導入全部屬性。

use CGI qw(:all);

若是模塊還提供了一個名爲tag的標籤,那麼能夠導入這個標籤:

use MODULE_NAME qw(:tag);

想要知道模塊是否提供了標籤,以及提供了哪些標籤,能夠man MODULE獲取。例如,CGI模塊的man CGI文檔中有一段內容以下:

Here is a list of the function sets you can import:

    :cgi
       Import all CGI-handling methods, such as param(), path_info() and the like.

    :form
       Import all fill-out form generating methods, such as textfield().

    :html2
       Import all methods that generate HTML 2.0 standard elements.

    :html3
       Import all methods that generate HTML 3.0 elements (such as <table>, <super> and <sub>).

    :html4
       Import all methods that generate HTML 4 elements (such as <abbrev>, <acronym> and <thead>).

    :netscape
       Import the <blink>, <fontsize> and <center> tags.

    :html
       Import all HTML-generating shortcuts (i.e. 'html2', 'html3', 'html4' and 'netscape')

    :standard
       Import "standard" features, 'html2', 'html3', 'html4', 'form' and 'cgi'.

    :all
        Import all the available methods.

模塊查找路徑和@INC

默認狀況下,perl將從@INC指定的路徑中查找模塊,它就像shell的PATH環境變量同樣。

如下是@INC的路徑:

[root@xuexi ~]# perl -e 'foreach (@INC){print "$_\n"};'
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.26.1
/usr/local/share/perl/5.26.1
/usr/lib/x86_64-linux-gnu/perl5/5.26
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.26
/usr/share/perl/5.26
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base

若是咱們手動安裝的包,或者安裝到了一個非默認的查找路徑下(例如不一樣用戶安裝到了不一樣家目錄下),這時能夠經過在shell中設置PERL5LIB環境變量,perl會臨時從這個環境變量中去查找模塊。

[root@xuexi ~]# export PERL5LIB="/home/fairy/myperl"

或者,在perl命令行中使用-I選項,顯式指定待運行程序的模塊查找路徑。

[root@xuexi ~]# perl -I/home/fairy/myperl PERL_PROGRAM

還有幾種更復雜的方法:

  • (1).在perl程序中,在use引用模塊以前,使用BEGIN {unshift @INC,"/home/fairy/myperl"};語句,使得@INC在編譯期間就加上指定的查找目錄
  • (2).在perl程序中,在use引用模塊以前,使用use lib "/home/fairy/myperl";指定lib查找路徑

因爲這些方法都不方便,因此,直接設置PERL5LIB環境變量,或者設置local::lib便可。

相關文章
相關標籤/搜索