相同:
都可以用來引用module(.PM)。
不同:
1) 區別在於USE是在當前默認的@INC里面去尋找,一旦模塊不在@INC中的話,用USE是不可以引入的,但是require可以指定路徑;
2)use引入的名稱不需要后綴名,默認找.PM文件,而require需要后綴名,且后綴名可以為.PM或.PL;
實例:c:\perl目錄下3個文件如下(且module文件的最后必須有1;)
use strict;
BEGIN {
my $scriptDir = $0;
$scriptDir =~ s:\\:/:g;
$scriptDir =~ s,/?[^/]+$,,;
$scriptDir = "." if ($scriptDir eq "");
unshift(@INC, $scriptDir);
}
#require "c:\\perl\\pmodule1.pl";
require "pmodule1.pl";
use pmodule2;
Hello1();
Hello2();
print "I am caller!\n";
exit 0;
#file : pmodule1.pl
use strict;
sub Hello1
{
print "Hello1\n";
}
1;
#file : pmodule2.pm
use strict;
sub Hello2
{
print "Hello2\n";
}
1;
3)use語句是編譯時引入的,require是運行時引入的; 下面的例子是錯誤的:
use Config;
if( $Config{'osname'} eq "MSWin32" )
{
use Win32Module;
}
else
{
use UnixModule;
}
正因為use是發生在編譯期,代碼沒有執行,所以$Config變量的值是無法判斷的。在內部,use其實調用了require和import靜態函數。import()函數告訴包哪些特征將要被導入當前包中,這意味着用之前不必驗證函數或者變量是否合法。而require是不會調用import()的。
4)use引入模塊的同時,也引入了模塊的子模塊。而require則不能引入,要在重新聲明;例如
use my
my中包含了一個Module.pm
而require 則需要引入
require my
require my::Module.pm
如果不想讓use引入Module.pm則可以用 use require() 加一對括號來說明即可。
5)USE引用模塊時,如果模塊名稱中包含::雙冒號,該雙冒號將作為路徑分隔符,相當於Unix下的/或者Windows下的\。 如:
use MyDirectory::MyModule;
編譯器將從@INC指定的目錄下的MyDirectory子目錄去尋找MyModule模塊, 類似
如下路徑:
C:\Perl\lib\MyDirectory
C:\Perl\ext\lib\MyDirectory
C:Perl\site\lib\MyDirectory
完