內容

名稱

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

META 字元

\       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}eabe 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() 函式會在內部使用這個函式。

POSIX 標記

如果未提供標記引數,則會設定 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_CSHGLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT 的同義字。

POSIX 提供的 GLOB_APPENDGLOB_DOOFFS,以及 FreeBSD 擴充的 GLOB_ALTDIRFUNCGLOB_MAGCHAR 旗標尚未在 Perl 版本中實作,因為它們涉及與底層 C 結構更複雜的互動。

下列旗標已在 Perl 實作中加入,以符合 csh 相容性

GLOB_ALPHASORT

如果 GLOB_NOSORT 未生效,則按字母順序(不分大小寫)而非 ASCII 順序排序檔案名稱。

診斷

bsd_glob() 會傳回一個可能為零長度的相符路徑清單。如果發生錯誤,&File::Glob::GLOB_ERROR 將會是非零,且 $! 會被設定。如果未發生錯誤,&File::Glob::GLOB_ERROR 保證為零,否則會是下列值之一

GLOB_NOSPACE

嘗試配置記憶體失敗。

GLOB_ABEND

因為遇到錯誤,所以 glob 已停止。

在 bsd_glob() 找到一些相符路徑,但因錯誤而中斷時,它會傳回一個檔案名稱清單設定 &File::Glob::ERROR。

請注意,bsd_glob() 偏離 POSIX 和 FreeBSD glob(3) 行為,不會將 ENOENTENOTDIR 視為錯誤 - bsd_glob() 會繼續處理,無視這些錯誤,除非 GLOB_ERR 旗標已設定。

請注意,從 File::Glob 傳回的所有檔案名稱都是受污染的。

注意事項

另請參閱

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 提供給柏克萊的軟體。

允許以原始碼和二進位形式重新散布和使用,無論是否修改,但前提是符合以下條件

  1. 原始碼的重新散布必須保留上述版權公告、此條件清單和以下免責聲明。

  2. 二進位形式的重新散布必須在文件和/或隨散布提供的其他材料中重現上述版權公告、此條件清單和以下免責聲明。

  3. 未經事先明確書面許可,不得使用大學或其貢獻者的名稱來認可或宣傳從此軟體衍生的產品。

董事會和貢獻者「依現狀」提供此軟體,並拒絕任何明示或暗示的保證,包括但不限於對適銷性和特定用途適用性的暗示保證。在任何情況下,董事會或貢獻者都不對任何直接、間接、附帶、特殊、懲罰性或後果性損害(包括但不限於取得替代商品或服務;使用、資料或利潤損失;或業務中斷)負責,無論如何造成,以及基於任何責任理論,無論是在合約、嚴格責任或侵權(包括疏忽或其他)中,因使用此軟體而以任何方式產生的,即使已告知此類損害的可能性。