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 操作。具体例程将在下面描述。这些函数被原型化为一元运算符,除了 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
成功返回真值,失败返回 undef
。
getname
函数返回与 Perl I/O 句柄关联的文件规范。如果发生错误,它将返回 undef
。
此函数删除其参数中命名的文件,成功返回真值,失败返回 undef
。它与 CORE Perl 函数 unlink
不同,因为它不会尝试重置文件保护,即使原始保护没有授予您对文件的删除访问权限(参见 perlvms)。换句话说,remove
等效于
unlink($file) if VMS::Filespec::candelete($file);
rewind
将指定文件句柄的当前位置重置为文件开头。它实际上只是一个方便的方法,其效果等同于 seek($fh,0,0)
。成功返回真值,失败返回 undef
。
此函数设置进程的默认设备和目录。它与内置的 chdir() 运算符相同,只是更改在 Perl 退出后仍然存在。成功时返回真值,遇到错误时返回 undef
。
此函数将指定文件句柄的缓冲数据从 stdio 和 RMS 缓冲区刷新到磁盘。如果成功,它将返回真值;否则,它将返回 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 方法,则必须在您的程序中显式地执行此操作。这样做是为了避免在打算将 vmsopen
返回的句柄仅用作普通 Perl 文件句柄的程序中初始化 IO::File 包的开销。当包含 VMS::Stdio 文件句柄的标量被覆盖、undef
或超出范围时,关联的文件将自动关闭。
文件特性选项
设置此文件的分配数量
文件块大小
设置文件的上下文。接受以下参数之一
设置默认扩展量
设置默认文件名字符串。用于填充传递的文件名的任何缺失部分。
文件处理选项。接受以下选项之一或多个(如果有多个,则以逗号分隔列表形式)
固定头大小
为文件请求的全局缓冲区
多块计数
缓冲区计数
最大记录大小
文件记录属性。取以下值之一
文件记录格式。取以下值之一
记录处理操作。在逗号分隔的列表中取以下值之一或多个
异步 I/O。
取消 Ctrl/O(与终端 I/O 一起使用)。
从终端读取时将字符大写。
仅将记录流定位到连接操作的末尾。
不锁定记录。
启用从终端输入时使用由 pmt=usr-prmpt 指定的提示。
从终端读取时消除类型提前缓冲区中的任何信息。
锁定记录以供此进程读取操作,同时允许其他访问者读取记录。
锁定记录以进行写入。
在键盘上输入数据时,抑制在屏幕上回显输入数据。
指示 Ctrl/U、Ctrl/R 和 DELETE 不应被视为终端输入的控制命令,而应传递给应用程序。
无论锁定与否都读取。
如果请求的服务立即完成其任务,则返回 RMS$_SYNCH 的成功状态。
超时 I/O。
允许使用顺序记录访问模式的 put/write 服务在文件的任何位置发生,并在该位置截断文件。
禁止 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。