File::Glob - Perl 擴充功能,用於 BSD glob 常式
use File::Glob ':bsd_glob';
@list = bsd_glob('*.[ch]');
$homedir = bsd_glob('~gnat', GLOB_TILDE | GLOB_ERR);
if (GLOB_ERROR) {
# an error occurred reading $homedir
}
## override the core glob (CORE::glob() does this automatically
## by default anyway, since v5.6.0)
use File::Glob ':globally';
my @sources = <*.{c,h,y}>;
## override the core glob, forcing case sensitivity
use File::Glob qw(:globally :case);
my @sources = <*.{c,h,y}>;
## override the core glob forcing case insensitivity
use File::Glob qw(:globally :nocase);
my @sources = <*.{c,h,y}>;
## glob on all files in home directory
use File::Glob ':globally';
my @sources = <~gnat/*>;
glob 尖括號運算子 <>
是路徑名稱產生器,實作類似 Bourne shell 或 C shell 等類 Unix shell 所使用的檔案名稱樣式比對規則。
File::Glob::bsd_glob() 實作 FreeBSD glob(3) 常式,它是 POSIX glob() 的超集(說明見 IEEE Std 1003.2 "POSIX.2")。bsd_glob() 會接收必要的 pattern
參數,以及選用的 flags
參數,並傳回符合樣式的檔案名稱清單,其中樣式的詮釋會受到 flags
變數的修改。
自 v5.6.0 起,Perl 的 CORE::glob() 是以 bsd_glob() 的方式實作。請注意,它們的原型不同,CORE::glob() 只接受單一參數。由於歷史因素,CORE::glob() 也會將其參數以空白字元分割,並將其視為多個樣式,而 bsd_glob() 則將其視為單一樣式。但請參閱 "匯出" 中的 :bsd_glob
。
\ Quote the next metacharacter
[] Character class
{} Multiple pattern
* Match any string of characters
? Match any single character
~ User name home directory
元標記 a{b,c,d}e
是 abe ace ade
的簡寫。由左至右的順序會被保留,而比對結果會在低階層級中分開排序,以保留此順序。特殊情況下,{
、}
和 {}
會不受影響地傳遞。
另請參閱下方「POSIX 標記」中的內容,它們可以個別匯出。
:bsd_glob
:bsd_glob
匯出標籤會匯出 bsd_glob() 和下方列出的常數。它也會覆寫呼叫套件中的 glob(),使其在空格方面表現得像 bsd_glob()(空格會被視為檔案名稱的一部分),但支援在標量內容中反覆運算;也就是說,它會保留核心函式的功能,每次呼叫時都會傳回下一個項目。
:glob
:glob
標籤現已不建議使用,它是 :bsd_glob
的舊版本。它會匯出相同的常數和函式,但其 glob() 覆寫不支援反覆運算;它會在標量內容中傳回最後一個檔案名稱。這表示這會永遠迴圈
use File::Glob ':glob';
while (my $file = <* copy.txt>) {
...
}
bsd_glob
此函式包含在上面列出的兩個匯出標籤中,它會接收一個或兩個引數。第一個是 glob 模式。第二個(如果已提供)是一組 ORed 的標記。可用的標記和預設標記組列在「POSIX 標記」下的 # 中。
請記住,要使用標記的常數,您必須匯入它們,例如使用上面說明的 :bsd_glob
。如果未匯入,且 use strict
未生效,則常數會被視為裸字串,這不會產生您預期的結果。
:nocase
和 :case
這兩個匯出標籤會全面修改 bsd_glob() 和(除了在 VMS 上)Perl 內建 glob
算子使用的預設標記。GLOB_NOCASE
會分別開啟或關閉。
csh_glob
csh_glob() 函式也可以匯出,但除非您真的知道自己在做什麼,否則不應直接使用它。它會將模式拆分成字詞,並將每個字詞提供給 bsd_glob()。Perl 本身的 glob() 函式會在內部使用這個函式。
如果未提供標記引數,則會設定 GLOB_CSH
,而在 VMS 和 Windows 系統上,也會設定 GLOB_NOCASE
。否則,要使用的標記將完全由標記引數決定。POSIX 定義的標記為
GLOB_ERR
強制 bsd_glob() 在遇到無法開啟或讀取的目錄時傳回錯誤。一般來說,bsd_glob() 會繼續尋找符合的項目。
GLOB_LIMIT
當模式擴充為大於系統常數 ARG_MAX
(通常在 limits.h 中找到)的大小時,讓 bsd_glob() 傳回錯誤(GLOB_NOSPACE)。如果您的系統未定義此常數,bsd_glob() 會使用 sysconf(_SC_ARG_MAX)
或 _POSIX_ARG_MAX
(依序)。您可以使用標準 POSIX
擴充元件檢查這些值。
GLOB_MARK
符合模式的每個路徑名稱(目錄)都會附加斜線。
GLOB_NOCASE
預設情況下,檔案名稱會區分大小寫;此旗標會讓 bsd_glob() 將大小寫差異視為不重要。
GLOB_NOCHECK
如果模式不符合任何路徑名稱,bsd_glob() 會傳回僅包含模式的清單。如果設定了 GLOB_QUOTE
,其效果會出現在傳回的模式中。
GLOB_NOSORT
預設情況下,路徑名稱會以遞增 ASCII 順序排序;此旗標會防止這種排序(加快 bsd_glob() 的速度)。
FreeBSD 對 POSIX 標準的擴充元件是下列旗標
GLOB_BRACE
預先處理字串以擴充 {pat,pat,...}
字串,例如 csh(1)。模式 '{}' 出於歷史原因而未擴充(csh(1) 也做同樣的事,以簡化 find(1) 模式的輸入)。
GLOB_NOMAGIC
與 GLOB_NOCHECK
相同,但它僅在模式不包含任何特殊字元 "*", "?" 或 "[" 時傳回模式。NOMAGIC
是為了簡化實作歷史悠久的 csh(1) 全域比對行為而提供的,可能不應在其他任何地方使用。
GLOB_QUOTE
使用反斜線 ('\') 字元進行引號處理:模式中每個反斜線後接字元的出現都會被該字元取代,避免對字元進行任何特殊詮釋。(但在 DOSISH 系統上,請參閱下方的例外事項)。
GLOB_TILDE
將以 '~' 開頭的模式擴充為使用者名稱的家目錄。
GLOB_CSH
為方便起見,GLOB_CSH
是 GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT
的同義字。
POSIX 提供的 GLOB_APPEND
、GLOB_DOOFFS
,以及 FreeBSD 擴充的 GLOB_ALTDIRFUNC
和 GLOB_MAGCHAR
旗標尚未在 Perl 版本中實作,因為它們涉及與底層 C 結構更複雜的互動。
下列旗標已在 Perl 實作中加入,以符合 csh 相容性
GLOB_ALPHASORT
如果 GLOB_NOSORT
未生效,則按字母順序(不分大小寫)而非 ASCII 順序排序檔案名稱。
bsd_glob() 會傳回一個可能為零長度的相符路徑清單。如果發生錯誤,&File::Glob::GLOB_ERROR 將會是非零,且 $!
會被設定。如果未發生錯誤,&File::Glob::GLOB_ERROR 保證為零,否則會是下列值之一
在 bsd_glob() 找到一些相符路徑,但因錯誤而中斷時,它會傳回一個檔案名稱清單且設定 &File::Glob::ERROR。
請注意,bsd_glob() 偏離 POSIX 和 FreeBSD glob(3) 行為,不會將 ENOENT
和 ENOTDIR
視為錯誤 - bsd_glob() 會繼續處理,無視這些錯誤,除非 GLOB_ERR
旗標已設定。
請注意,從 File::Glob 傳回的所有檔案名稱都是受污染的。
如果您想使用多個模式,例如 bsd_glob("a* b*")
,您應該將它們放入一個集合中,例如 bsd_glob("{a*,b*}")
。這是因為 bsd_glob() 的參數不會受到 C shell 的解析。請記住,您可以使用反斜線來跳脫內容。
在 DOSISH 系統上,反斜線是有效的目錄分隔字元。在此情況下,使用反斜線作為引號字元(透過 GLOB_QUOTE)會干擾反斜線作為目錄分隔字元的用途。最佳(最簡單、最可攜式)的解決方案是使用正斜線作為目錄分隔字元,並使用反斜線作為引號。然而,這並不符合這些系統上的「正常慣例」。因此,為了符合使用者的期望,反斜線(在 GLOB_QUOTE 下)只會引號 glob 的後設字元 '[', ']', '{', '}', '-', '~' 和反斜線本身。所有其他反斜線都會不變地傳遞。
Win32 使用者應使用真正的斜線。如果您真的想使用反斜線,請考慮使用 Sarathy 的 File::DosGlob,它附帶標準 Perl 發行版。
perlfunc 中的「glob」,glob(3)
Perl 介面是由 Nathan Torkington <gnat@frii.com> 編寫,並在 artistic license 下發布。後續修改是由 Greg Bacon <gbacon@cs.uah.edu>、Gurusamy Sarathy <gsar@activestate.com> 和 Thomas Wegner <wegner_thomas@yahoo.com> 進行。C glob 程式碼具有以下版權
版權所有 (c) 1989、1993 加州大學董事會。保留所有權利。
此程式碼源自 Guido van Rossum 提供給柏克萊的軟體。
允許以原始碼和二進位形式重新散布和使用,無論是否修改,但前提是符合以下條件
原始碼的重新散布必須保留上述版權公告、此條件清單和以下免責聲明。
二進位形式的重新散布必須在文件和/或隨散布提供的其他材料中重現上述版權公告、此條件清單和以下免責聲明。
未經事先明確書面許可,不得使用大學或其貢獻者的名稱來認可或宣傳從此軟體衍生的產品。
董事會和貢獻者「依現狀」提供此軟體,並拒絕任何明示或暗示的保證,包括但不限於對適銷性和特定用途適用性的暗示保證。在任何情況下,董事會或貢獻者都不對任何直接、間接、附帶、特殊、懲罰性或後果性損害(包括但不限於取得替代商品或服務;使用、資料或利潤損失;或業務中斷)負責,無論如何造成,以及基於任何責任理論,無論是在合約、嚴格責任或侵權(包括疏忽或其他)中,因使用此軟體而以任何方式產生的,即使已告知此類損害的可能性。