VMS::Filespec - 在 VMS 和 Unix 檔案規格語法之間轉換
use VMS::Filespec;
$fullspec = rmsexpand('[.VMS]file.specification'[, 'default:[file.spec]']);
$vmsspec = vmsify('/my/Unix/file/specification');
$unixspec = unixify('my:[VMS]file.specification');
$path = pathify('my:[VMS.or.Unix.directory]specification.dir');
$dirfile = fileify('my:[VMS.or.Unix.directory.specification]');
$vmsdir = vmspath('my/VMS/or/Unix/directory/specification.dir');
$unixdir = unixpath('my:[VMS.or.Unix.directory]specification.dir');
candelete('my:[VMS.or.Unix]file.specification');
$case_tolerant = case_tolerant_process;
$unixspec = unixrealpath('file_specification');
$vmsspec = vmsrealpath('file_specification');
此套件提供常式,用於在處理檔案規格時簡化 VMS 和 Unix 語法之間的轉換。這在移植設計為在任一作業系統下執行的指令碼時很有用,而且還能讓您利用任一語法提供的便利性(例如:輕鬆串接 Unix 風格的規格)。此外,它還提供額外的檔案測試常式 candelete
,用於判斷您是否有權限刪除檔案。
如果您在 VMS 下執行,此套件中的常式很特別,因為它們會自動提供給任何 Perl 腳本,無論您執行的是 miniperl 或完整的 perl。use VMS::Filespec
或 require VMS::Filespec; import VMS::Filespec ...
陳述式可用於將函數名稱匯入目前的套件,但如果您使用完全限定的名稱,它們總是可用的,無論您是否在腳本中提到 .pm 檔案。如果您在其他作業系統下執行並已安裝此套件,它會像一般的 Perl 延伸模組一樣運作(事實上,您使用 Perl 替代品來模擬必要的 VMS 系統呼叫)。
這些常式每個都接受 VMS 或 Unix 語法中的檔案規格,並傳回已轉換的檔案規格,或在發生錯誤時傳回 undef
。轉換大部分來說只是字串處理;常式不會檢查語法的詳細資料(例如只使用合法的字元)。有一個例外:在 VMS 下執行時,從 VMS 語法轉換會使用 $PARSE 服務來擴充規格,因此非法的語法或相對於目錄規格會延伸到目前目錄路徑頂端(例如在 dev:[dir.sub] 時為 [---.foo])會導致錯誤。一般而言,任何合法的檔案規格都會正確轉換,但垃圾輸入往往會產生垃圾輸出。
這些常式每個都設定為採用單一純量引數,因此您可以將它們用作複雜表達式中的單元運算子(只要您不使用 &
形式的子常式呼叫,它會略過設定檢查)。
提供的常式如下
使用 RMS $PARSE 和 $SEARCH 服務將輸入規格擴充到其完全限定的形式,但除非它存在於原始檔案規格或傳遞給 rmsexpand
的預設規格中,否則不會新增空類型或版本。(如果檔案不存在,輸入規格會盡可能地擴充。)如果發生錯誤,會傳回 undef
並設定 $!
和 $^E
。
如果成功,rmsexpand
會產生一個符合 255 位元組緩衝區的名稱,這是傳遞給 DCL 解譯器的參數所需要的。
將檔案規格轉換成 VMS 語法。如果檔案規格無法轉換成 VMS 語法或已經是 VMS 語法,它會不變地傳遞。
檔案規格 .
和 ..
將會轉換為 []
和 [-]
。
如果檔案規格已經是有效的 VMS 語法,它將會原封不動地傳遞,只會清除 UTF-8 標記,因為 VMS 格式的檔案規格從來不會是 UTF-8。
如果 Perl 在 OpenVMS 系統上執行,且 DECC$EFS_CHARSET
功能未啟用,檔案規格中的額外點將會轉換為底線字元,且 ?
字元將會轉換為 %
字元(如果進行轉換的話)。
如果 Perl 在 OpenVMS 系統上執行,且 DECC$EFS_CHARSET
功能已啟用,這表示 Unix 路徑名稱不能有版本,且由三個點組成的路徑 ./.../
將會轉換為 [.^.^.^.]
。
Unix 風格的 shell 巨集,例如 $(abcd)
,會直接傳遞,而不是轉換為 $^(abcd^)
,與 DECC$EFS_CHARSET
功能設定無關。Unix 風格的 shell 巨集不應使用 ASCII 字元集以外的字元,因為產生的規格可能不會仍是 UTF8 格式。
功能邏輯名稱 PERL_VMS_VTF7_FILENAMES
控制 Unix 檔案名稱中的 UNICODE 字元是否使用 VTF-7 表示法編碼在產生的 OpenVMS 檔案規格中。[目前正在開發中]
對產生的檔案規格執行 unixify
可能不會產生原始的 Unix 檔案規格,因此程式不應計畫在修改組件後將檔案規格從 Unix 轉換為 VMS,然後再轉換回 Unix。
將檔案規格轉換為 Unix 語法。如果檔案規格無法轉換為 Unix 語法,或已經是 Unix 語法,它將會原封不動地傳遞。
如果 Perl 在 OpenVMS 系統上執行,下列 DECC$
功能設定將控制檔案名稱的轉換方式
C<decc$disable_to_vms_logname_translation:> default = C<ENABLE>
C<decc$disable_posix_root:> default = C<ENABLE>
C<decc$efs_charset:> default = C<DISABLE>
C<decc$filename_unix_no_version:> default = C<DISABLE>
C<decc$readdir_dropdotnotype:> default = C<ENABLE>
如果 Perl 在 OpenVMS 上的 Unix shell 下執行,未來預設值可能會更適合它。
如果 Perl 在啟用 DECC$EFS_CHARSET
的 OpenVMS 系統上執行,[...]
的萬用字元目錄名稱無法轉換為有效的 Unix 檔案規格。此外,目錄檔案規格的隱含 ".dir;1"
將會移除,且表示空字尾的尾隨 .
字元將會移除。
請注意,DECC$EFS_CHARSET
需要 DECC$FILENAME_UNIX_NO_VERSION
,因為轉換常式無法區分 Unix 規格的最後一個 .
是用來界定版本,還是只是檔案規格的一部分。
對產生的檔案規格執行 vmsify
可能不會產生原始的 VMS 檔案規格,因此程式不應計畫在修改後將檔案規格從 VMS 轉換為 Unix,然後再轉換回 VMS。
將目錄規格轉換為路徑,也就是說,您可以將字串加到檔案名稱前面,以形成有效的檔案規格。如果輸入檔案規格使用 VMS 語法,傳回的路徑也會使用 VMS 語法;Unix 語法也是如此(Unix 路徑保證以 '/' 結尾)。請注意,此常式會堅持輸入為合法的目錄檔案規格;如果指定檔案類型和版本,則必須是 .DIR;1。為了與 Unix 用法相容,類型和版本也可以省略。
將目錄規格轉換為目錄檔案的檔案規格 - 也就是說,您可以傳遞一個字串給函數,例如 stat
或 rmdir
來操作目錄檔案。如果輸入目錄規格使用 VMS 語法,傳回的檔案規格也會使用;Unix 語法亦同。與 pathify
一樣,輸入檔案規格的類型和版本必須為 .DIR;1,或者類型和版本必須省略。
作用類似於 pathify
,但確保傳回的路徑使用 VMS 語法。
作用類似於 pathify
,但確保傳回的路徑使用 Unix 語法。
判斷您是否有權限刪除檔案。如果您有權限,candelete
會傳回 true。如果您沒有權限,或者其引數不是合法的檔案規格,candelete
會傳回 FALSE。與其他檔案測試不同,candelete
的引數必須是檔案名稱(不是 FileHandle),而且,由於它是 XSUB,所以是清單運算子,因此您需要小心使用括號。如果 candelete
的功能成為 Perl 核心的一部分,這兩個限制都可能會在未來移除。
這會報告 VMS 程序是否已設定為大小寫相容狀態,並在程序處於傳統大小寫相容模式時傳回 true,在程序已啟用大小寫敏感時傳回 false。它僅供 File::Spec::VMS->case_tolerant 方法使用,建議您僅使用 File::Spec->case_tolerant。
這會公開 VMS C 函式庫 realpath
函數(如果可用)。它將永遠傳回 Unix 格式規格。
如果 realpath
函數不可用,或者無法傳回檔案的實際路徑,unixrealpath
將使用與 vmsrealpath
函數相同的內部程序,並將輸出轉換為 Unix 格式規格。它在非 VMS 系統上不可用。
這使用 LIB$FID_TO_NAME
執行時期函式庫呼叫來尋找檔案主要連結的名稱,並以 VMS 格式傳回檔案名稱。此函數在非 VMS 系統上不可用。
此文件最後於 2007 年 12 月 8 日針對 Perl 5.10.0 修訂