VMS::Stdio - 透過 VMS 擴充功能的標準 I/O 函數
use VMS::Stdio qw( &flush &getname &remove &rewind &setdef &sync
&tmpnam &vmsopen &vmssysopen &waitfh &writeof );
setdef("new:[default.dir]");
$uniquename = tmpnam;
$fh = vmsopen("my.file","rfm=var","alq=100",...) or die $!;
$name = getname($fh);
print $fh "Hello, world!\n";
flush($fh);
sync($fh);
rewind($fh);
$line = <$fh>;
undef $fh; # closes file
$fh = vmssysopen("another.file", O_RDONLY | O_NDELAY, 0, "ctx=bin");
sysread($fh,$data,128);
waitfh($fh);
close($fh);
remove("another.file");
writeof($pipefh);
binmode($fh);
此套件讓 Perl 腳本可透過 VMS 擴充功能存取 Perl 的 CORE I/O 函數中沒有提供的幾個 C stdio 作業。特定常式如下所述。這些函數的原型是單元運算子,例外為 vmsopen
和 vmssysopen
,它們可以接受任意數量的引數,以及不接受任何引數的 tmpnam
。
所有常式都可供匯出,但預設都不會匯出。vmssysopen
用於指定存取模式的所有常數預設都會匯出。這些常式與 Exporter 標籤 FUNCTIONS 關聯,而常數與 Exporter 標籤 CONSTANTS 關聯,因此您可以更輕鬆地選擇要匯入的內容
# import constants, but not functions
use VMS::Stdio; # same as use VMS::Stdio qw( :DEFAULT );
# import functions, but not constants
use VMS::Stdio qw( !:CONSTANTS :FUNCTIONS );
# import both
use VMS::Stdio qw( :CONSTANTS :FUNCTIONS );
# import neither
use VMS::Stdio ();
當然,您也可以像往常一樣選擇匯入特定函數的名稱。
此套件 ISA
IO::File,因此您可以在 vmsopen
和 vmssysopen
傳回的控制代碼上呼叫 IO::File 方法。不過,IO::File 套件並未初始化,直到您實際呼叫 VMS::Stdio 未提供的某個方法。這麼做的目的是為不想要使用 IO::File 方法的使用者節省啟動時間。
注意:為了符合 Perl 擴充套件和函數的命名慣例,此套件的名稱已從 VMS::stdio 變更為 VMS::Stdio(Perl 5.002 起),且某些例程的名稱也已變更。在許多版本中,呼叫舊的 VMS::stdio 例程會產生警告,然後路由到等效的 VMS::Stdio 函數。此相容性介面現已移除。
此函數會導致檔案控制代碼關閉 CRTL 的換行控制處理,重新開啟檔案控制代碼;其效果與 vmsopen 中的 b
存取模式相同。重新開啟檔案後,檔案指標會盡可能定位在呼叫前的相同位置(即與 fsetpos() 能達到的位置相同,對於某些記錄結構的檔案,無法返回檔案中的確切位元組偏移量)。由於必須重新開啟檔案,因此無法在暫時刪除的檔案上使用此函數。binmode
在成功時會傳回 true,失敗時會傳回 undef
。
請注意,binmode
的效果與 Windows 和 MSDOS 等作業系統上的 binmode() 函數不同,而且不需要處理大多數類型的檔案。
此函數會導致指定的檔案控制代碼的 stdio 緩衝區內容被清除。如果將 undef
用作 flush
的引數,則會清除所有目前開啟的檔案控制代碼。與 CRTL fflush() 例程一樣,它不會清除檔案的任何基礎 RMS 緩衝區,因此資料可能無法完全清除到磁碟。flush
在成功時會傳回 true,失敗時會傳回 undef
。
getname
函數會傳回與 Perl I/O 控制代碼關聯的檔案規格。如果發生錯誤,它會傳回 undef
。
此函數會刪除其引數中指定的名稱的檔案,成功時會傳回 true,失敗時會傳回 undef
。它與 CORE Perl 函數 unlink
的不同之處在於,如果原始保護不允許您刪除檔案,它不會嘗試重設檔案保護(請參閱 perlvms)。換句話說,remove
等於
unlink($file) if VMS::Filespec::candelete($file);
rewind
會將指定檔案控制代碼的目前位置重設為檔案的開頭。它實際上只是一個方便的方法,其效果等同於 seek($fh,0,0)
。它在成功時會傳回 true,失敗時會傳回 undef
。
此函數設定程序的預設裝置和目錄。它與內建的 chdir() 運算子相同,但變更會在 Perl 結束後持續。它在成功時傳回 true 值,在遇到錯誤時傳回 undef
。
此函數會將指定的檔案控制代碼的緩衝資料從 stdio 和 RMS 緩衝區一路清除到磁碟。如果成功,它會傳回 true 值;否則,它會傳回 undef
。
tmpnam
函數會傳回一個唯一字串,可在建立暫時檔案時用作檔名。如果因為某些原因而無法產生名稱,它會傳回 undef
。
vmsopen
函數讓您可以在開啟檔案時,為 VMS CRTL 指定選用的 RMS 引數。它的運作類似於內建的 Perl open
函數(請參閱 perlfunc 以取得完整的說明),但它只會開啟一般檔案;它無法開啟管線或複製現有的 I/O 控制代碼。最多有 8 個選用引數可以放在檔名之後。這些引數應該是字串,用來指定 CRTL 允許的選用檔案特性。(請參閱 CRTL 參考手冊中 creat() 和 fopen() 的說明以取得詳細資料。)如果成功,vmsopen
會傳回 VMS::Stdio 檔案控制代碼;如果發生錯誤,它會傳回 undef
。
您可以像使用任何其他 Perl 檔案控制代碼一樣,使用 vmsopen
傳回的檔案控制代碼。類別 VMS::Stdio ISA IO::File,因此您可以使用 vmsopen
傳回的控制代碼來呼叫 IO::File 方法。但是,use
ing VMS::Stdio 並不會自動 use
IO::File;如果您想要呼叫 IO::File 方法,您必須在程式中明確這麼做。這是為了避免在程式中初始化 IO::File 套件的開銷,而這些程式打算將 vmsopen
傳回的控制代碼當作一般的 Perl 檔案控制代碼使用。當包含 VMS::Stdio 檔案控制代碼的純量被覆寫、undef
d 或超出範圍時,相關的檔案會自動關閉。
檔案特性選項
設定此檔案的配置數量
檔案區塊大小
設定檔案的內容。取用下列其中一個引數
設定預設延伸數量
設定預設檔案名稱字串。用於填入傳遞的檔案名稱中遺失的任何部分。
檔案處理選項。取用下列其中一個或多個(如果有多個,則以逗號分隔的清單列出)
固定標頭大小
要求檔案的全球緩衝區
多重區塊計數
多重緩衝區計數
最大記錄大小
檔案記錄屬性。採用下列其中一項
檔案記錄格式。採用下列其中一項
記錄處理作業。在逗號分隔清單中採用下列其中一項或多項
非同步 I/O。
取消 Ctrl/O(與終端機 I/O 搭配使用)。
從終端機讀取時將字元大寫。
僅針對連接作業將記錄串流定位至檔案結尾。
不鎖定記錄。
啟用從終端機輸入時使用 pmt=usr-prmpt 指定的提示。
從終端機讀取時消除先打字緩衝區中的任何資訊。
鎖定記錄以供此程序讀取,同時允許其他存取器讀取記錄。
鎖定記錄以供寫入。
在鍵盤上輸入時,抑制輸入資料在螢幕上的回音。
表示在終端機輸入時,Ctrl/U、Ctrl/R 和 DELETE 不應視為控制命令,而應傳遞給應用程式。
不論鎖定與否,皆讀取。
如果請求的服務立即完成其任務,則傳回 RMS$_SYNCH 的成功狀態。
逾時 I/O。
允許使用順序記錄存取模式的置入/寫入服務發生在檔案中的任何位置,並在該位置截斷檔案。
禁止 RMS 自動解鎖記錄。
如果目前被另一串流鎖定,則等到記錄可用。
預先讀取。
寫入後。
RMS 必須維護的擷取指標數量 (0 至 127255)
檔案共用選項。選取下列其中一項
I/O 超時值
此函數與 CORE 函數 sysopen
的關係,與 vmsopen
與 open
的關係相同。它的前三個參數是檔案的名稱、存取旗標和權限。與 vmsopen
相同,它最多可接受 8 個額外的字串參數,用於指定檔案特性。它的傳回值與 vmsopen
相同。
預設情況下,模式參數的符號常數由 VMS::Stdio 匯出,並且也由 Fcntl 套件匯出。
此函數會讓 Perl 等待其參數所指定的檔案控制代碼上的 I/O 作業完成。它用於開啟非同步 I/O 的控制代碼,並透過呼叫 CRTL 常式 fwait() 來執行其任務。
如果裝置驅動程式支援此作業,此函數會寫入一個 EOF 至檔案控制代碼。它的主要用途是透過未關閉的寫入用管線,將 EOF 傳送至子程序。如果成功,它會傳回一個真值;如果遇到錯誤,它會傳回 undef
。
此文件最後於 1998 年 10 月 13 日為 Perl 5.004、5.005 和 5.6.0 修訂。