-- Start
require
如果我們有一個 date.pl,其中包含了一些關於日期操作的函數,如下:
#!/usr/bin/perlsub getToday {my (undef,undef,undef,$mday,$mon,$year) = localtime(time);return sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday);}# 必須返回一個布爾型的真值,否則 require 時會報錯return 1;
現在我想在自己的指令碼中使用 date.pl 中的函數該怎麼辦呢?很簡單,使用 require 將 date.pl 包含進來就可以了,下面是一個簡單的例子。
#!/usr/bin/perl# Perl 會在內建數組 @INC 指定的目錄中尋找檔案date.pl# 如果 @IN C中有多個目錄中含有同一個檔案,則只有第一個被包含push(@INC, "D:/Development/Perl");# 使用 require 將 date.pl 包含到我們的指令碼中require "date.pl";# 調用 date.pl 中的函數my $today = &getToday();print "Today is $today\n";
如果自己的指令碼中也有 getToday 函數會發生什麼呢?Perl 會忽略自己指令碼中的函數,而使用 date.pl 中的函數。這將導致我們無法調用自己定義的函數,那如何避免這種名字衝突呢?答案就是使用包。
包
我們將上面的例子稍作修改來示範包的使用。
#!/usr/bin/perl# 用包實現名字空間# 下面的例子定義了 date 包# 事實上,任何代碼都屬於某個包,如果沒有顯示指定包名,則預設屬於 main 包package date;sub getToday {my (undef,undef,undef,$mday,$mon,$year) = localtime(time);return sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday);}# 必須返回一個布爾型的真值,否則 require 時會報錯return 1;
#!/usr/bin/perlpush(@INC, "D:/Development/Perl");require "date.pl";# 調用 date.pl 中的函數,需要指定包名my $today = &date::getToday();print "Today is $today\n";# 調用自訂的同名函數my $today = &getToday();print "Today is $today\n";# 自定的函數sub getToday {my (undef,undef,undef,$mday,$mon,$year) = localtime(time);return sprintf("%04d-%02d-%02d", $year + 1900, $mon +1, $mday);}模組
如果我們想把 date.pl 發布給其他人使用,我們最好將它定義成一個模組,建立模組非常簡單,使用包來建立模組。我們將上面的例子稍作修改來示範如何建立模組。
我們將 date.pl 改名為 date.pm,其他不做任何修改。下面的例子示範如果使用 date.pm 模組。
#!/usr/bin/perl# 使用模組use date;# 調用 date 模組中的函數my $today = &date::getToday();print "Today is $today\n";# 調用自訂的同名函數my $today = &getToday();print "Today is $today\n";# 自定的函數sub getToday {my (undef,undef,undef,$mday,$mon,$year) = localtime(time);return sprintf("%04d-%02d-%02d", $year + 1900, $mon +1, $mday);}use 和 require 的區別
use 和 require 都可以將模組匯入到我們的程式中,它們之間的區別在於,無論 use 處於指令碼的何處,它總是在其他語句執行之前執行,而 require 語句執行的時機和它所處的位置有關。
-- 更多參見:Perl 精萃
-- 聲 明:轉載請註明出處
-- Last Updated on 2012-07-07
-- Written by ShangBo on 2012-07-07
-- End