內容

名稱

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 作業。特定常式如下所述。這些函數的原型是單元運算子,例外為 vmsopenvmssysopen,它們可以接受任意數量的引數,以及不接受任何引數的 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,因此您可以在 vmsopenvmssysopen 傳回的控制代碼上呼叫 IO::File 方法。不過,IO::File 套件並未初始化,直到您實際呼叫 VMS::Stdio 未提供的某個方法。這麼做的目的是為不想要使用 IO::File 方法的使用者節省啟動時間。

注意:為了符合 Perl 擴充套件和函數的命名慣例,此套件的名稱已從 VMS::stdio 變更為 VMS::Stdio(Perl 5.002 起),且某些例程的名稱也已變更。在許多版本中,呼叫舊的 VMS::stdio 例程會產生警告,然後路由到等效的 VMS::Stdio 函數。此相容性介面現已移除。

binmode

此函數會導致檔案控制代碼關閉 CRTL 的換行控制處理,重新開啟檔案控制代碼;其效果與 vmsopen 中的 b 存取模式相同。重新開啟檔案後,檔案指標會盡可能定位在呼叫前的相同位置(與 fsetpos() 能達到的位置相同,對於某些記錄結構的檔案,無法返回檔案中的確切位元組偏移量)。由於必須重新開啟檔案,因此無法在暫時刪除的檔案上使用此函數。binmode 在成功時會傳回 true,失敗時會傳回 undef

請注意,binmode 的效果與 Windows 和 MSDOS 等作業系統上的 binmode() 函數不同,而且不需要處理大多數類型的檔案。

flush

此函數會導致指定的檔案控制代碼的 stdio 緩衝區內容被清除。如果將 undef 用作 flush 的引數,則會清除所有目前開啟的檔案控制代碼。與 CRTL fflush() 例程一樣,它不會清除檔案的任何基礎 RMS 緩衝區,因此資料可能無法完全清除到磁碟。flush 在成功時會傳回 true,失敗時會傳回 undef

getname

getname 函數會傳回與 Perl I/O 控制代碼關聯的檔案規格。如果發生錯誤,它會傳回 undef

remove

此函數會刪除其引數中指定的名稱的檔案,成功時會傳回 true,失敗時會傳回 undef。它與 CORE Perl 函數 unlink 的不同之處在於,如果原始保護不允許您刪除檔案,它不會嘗試重設檔案保護(請參閱 perlvms)。換句話說,remove 等於

unlink($file) if VMS::Filespec::candelete($file);
rewind

rewind 會將指定檔案控制代碼的目前位置重設為檔案的開頭。它實際上只是一個方便的方法,其效果等同於 seek($fh,0,0)。它在成功時會傳回 true,失敗時會傳回 undef

setdef

此函數設定程序的預設裝置和目錄。它與內建的 chdir() 運算子相同,但變更會在 Perl 結束後持續。它在成功時傳回 true 值,在遇到錯誤時傳回 undef

sync

此函數會將指定的檔案控制代碼的緩衝資料從 stdio 和 RMS 緩衝區一路清除到磁碟。如果成功,它會傳回 true 值;否則,它會傳回 undef

tmpnam

tmpnam 函數會傳回一個唯一字串,可在建立暫時檔案時用作檔名。如果因為某些原因而無法產生名稱,它會傳回 undef

vmsopen

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 方法。但是,useing VMS::Stdio 並不會自動 use IO::File;如果您想要呼叫 IO::File 方法,您必須在程式中明確這麼做。這是為了避免在程式中初始化 IO::File 套件的開銷,而這些程式打算將 vmsopen 傳回的控制代碼當作一般的 Perl 檔案控制代碼使用。當包含 VMS::Stdio 檔案控制代碼的純量被覆寫、undefd 或超出範圍時,相關的檔案會自動關閉。

檔案特性選項

alq=INTEGER

設定此檔案的配置數量

bls=INTEGER

檔案區塊大小

ctx=字串

設定檔案的內容。取用下列其中一個引數

bin

停用 LF 至 CRLF 轉換

cvt

否定 ctx=noctx 的前一個設定

nocvt

停用 FORTRAN 換行控制的轉換

rec

強制記錄模式存取

stm

強制串流模式

xplct

導致記錄僅在檔案關閉時,或執行明確的快取時才快取

deq=整數

設定預設延伸數量

dna=檔案規格

設定預設檔案名稱字串。用於填入傳遞的檔案名稱中遺失的任何部分。

fop=字串

檔案處理選項。取用下列其中一個或多個(如果有多個,則以逗號分隔的清單列出)

ctg

連續。

cbt

連續最佳嘗試。

dfw

延遲寫入;僅適用於開放為共用存取的檔案。

dlt

關閉時刪除檔案。

tef

在檔案結尾處截斷。

cif

如果不存在,則建立。

sup

取代。

scf

關閉時作為命令檔案提交。

spl

關閉時轉送至系統印表機。

tmd

暫時刪除。

tmp

暫時(沒有檔案目錄)。

nef

不是檔案結尾。

rck

讀取檢查比較操作。

wck

寫入檢查比較操作。

mxv

最大化版本號碼。

rwo

開啟時倒回檔案。

pos

目前位置。

rwc

關閉時倒帶檔案。

sqo

檔案只能以順序方式處理。

fsz=INTEGER

固定標頭大小

gbc=INTEGER

要求檔案的全球緩衝區

mbc=INTEGER

多重區塊計數

mbf=INTEGER

多重緩衝區計數

mrs=INTEGER

最大記錄大小

rat=STRING

檔案記錄屬性。採用下列其中一項

cr

回車控制。

blk

禁止記錄跨越區塊邊界。

ftn

FORTRAN 列印控制。

none

明確強制不進行回車控制。

prn

列印檔案格式。

rfm=STRING

檔案記錄格式。採用下列其中一項

fix

固定長度記錄格式。

stm

RMS 串流記錄格式。

stmlf

具備換行終止符號的串流格式。

stmcr

具備回車終止符號的串流格式。

var

可變長度記錄格式。

vfc

具備固定控制的可變長度記錄。

udf

未定義格式

rop=STRING

記錄處理作業。在逗號分隔清單中採用下列其中一項或多項

asy

非同步 I/O。

cco

取消 Ctrl/O(與終端機 I/O 搭配使用)。

cvt

從終端機讀取時將字元大寫。

eof

僅針對連接作業將記錄串流定位至檔案結尾。

nlk

不鎖定記錄。

pmt

啟用從終端機輸入時使用 pmt=usr-prmpt 指定的提示。

pta

從終端機讀取時消除先打字緩衝區中的任何資訊。

rea

鎖定記錄以供此程序讀取,同時允許其他存取器讀取記錄。

rlk

鎖定記錄以供寫入。

rne

在鍵盤上輸入時,抑制輸入資料在螢幕上的回音。

rnf

表示在終端機輸入時,Ctrl/U、Ctrl/R 和 DELETE 不應視為控制命令,而應傳遞給應用程式。

rrl

不論鎖定與否,皆讀取。

syncsts

如果請求的服務立即完成其任務,則傳回 RMS$_SYNCH 的成功狀態。

tmo

逾時 I/O。

tpt

允許使用順序記錄存取模式的置入/寫入服務發生在檔案中的任何位置,並在該位置截斷檔案。

ulk

禁止 RMS 自動解鎖記錄。

wat

如果目前被另一串流鎖定,則等到記錄可用。

rah

預先讀取。

wbh

寫入後。

rtv=INTEGER

RMS 必須維護的擷取指標數量 (0 至 127255)

shr=STRING

檔案共用選項。選取下列其中一項

del

允許使用者刪除。

get

允許使用者讀取。

mse

允許主流存取。

nil

禁止檔案共用。

put

允許使用者寫入。

upd

允許使用者更新。

upi

允許一個或多個寫入者。

tmo=INTEGER

I/O 超時值

vmssysopen

此函數與 CORE 函數 sysopen 的關係,與 vmsopenopen 的關係相同。它的前三個參數是檔案的名稱、存取旗標和權限。與 vmsopen 相同,它最多可接受 8 個額外的字串參數,用於指定檔案特性。它的傳回值與 vmsopen 相同。

預設情況下,模式參數的符號常數由 VMS::Stdio 匯出,並且也由 Fcntl 套件匯出。

waitfh

此函數會讓 Perl 等待其參數所指定的檔案控制代碼上的 I/O 作業完成。它用於開啟非同步 I/O 的控制代碼,並透過呼叫 CRTL 常式 fwait() 來執行其任務。

writeof

如果裝置驅動程式支援此作業,此函數會寫入一個 EOF 至檔案控制代碼。它的主要用途是透過未關閉的寫入用管線,將 EOF 傳送至子程序。如果成功,它會傳回一個真值;如果遇到錯誤,它會傳回 undef

REVISION

此文件最後於 1998 年 10 月 13 日為 Perl 5.004、5.005 和 5.6.0 修訂。