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 语法中,则将原样传递,但 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
控制是否在生成的 OpenVMS 文件规范中以 VTF-7 表示法对 Unix 文件名中的 UNICODE 字符进行编码。[目前正在开发中]
对生成的规范进行 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 语法,则返回的文件规范也使用 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