内容

名称

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);

描述

此包通过 VMS 扩展为 Perl 脚本提供访问 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 成功返回真值,失败返回 undef

getname

getname 函数返回与 Perl I/O 句柄关联的文件规范。如果发生错误,它将返回 undef

remove

此函数删除其参数中命名的文件,成功返回真值,失败返回 undef。它与 CORE Perl 函数 unlink 不同,因为它不会尝试重置文件保护,即使原始保护没有授予您对文件的删除访问权限(参见 perlvms)。换句话说,remove 等效于

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

rewind 将指定文件句柄的当前位置重置为文件开头。它实际上只是一个方便的方法,其效果等同于 seek($fh,0,0)。成功返回真值,失败返回 undef

setdef

此函数设置进程的默认设备和目录。它与内置的 chdir() 运算符相同,只是更改在 Perl 退出后仍然存在。成功时返回真值,遇到错误时返回 undef

sync

此函数将指定文件句柄的缓冲数据从 stdio 和 RMS 缓冲区刷新到磁盘。如果成功,它将返回真值;否则,它将返回 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 方法,则必须在您的程序中显式地执行此操作。这样做是为了避免在打算将 vmsopen 返回的句柄仅用作普通 Perl 文件句柄的程序中初始化 IO::File 包的开销。当包含 VMS::Stdio 文件句柄的标量被覆盖、undef 或超出范围时,关联的文件将自动关闭。

文件特性选项

alq=INTEGER

设置此文件的分配数量

bls=INTEGER

文件块大小

ctx=STRING

设置文件的上下文。接受以下参数之一

bin

禁用 LF 到 CRLF 的转换

cvt

否定之前设置的 ctx=noctx

nocvt

禁用 FORTRAN 回车控制的转换

rec

强制记录模式访问

stm

强制流模式

xplct

仅在文件关闭或显式刷新时刷新记录

deq=INTEGER

设置默认扩展量

dna=FILESPEC

设置默认文件名字符串。用于填充传递的文件名的任何缺失部分。

fop=STRING

文件处理选项。接受以下选项之一或多个(如果有多个,则以逗号分隔列表形式)

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

允许使用顺序记录访问模式的 put/write 服务在文件的任何位置发生,并在该位置截断文件。

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。