内容

名称

VMS::DCLsym - Perl 扩展,用于操作 DCL 符号

概要

tie %allsyms, VMS::DCLsym;
tie %cgisyms, VMS::DCLsym, 'GLOBAL';


$handle = new VMS::DCLsym;
$value = $handle->getsym($name);
$handle->setsym($name, $value, 'GLOBAL')
    or die "Can't create symbol: $!\n";
$handle->delsym($name, 'LOCAL') or die "Can't delete symbol: $!\n";
$handle->clearcache();

说明

VMS::DCLsym 扩展提供使用绑定哈希接口访问 DCL 符号的功能。这允许 Perl 脚本以类似于通过内置 %ENV 哈希操作逻辑名称的方式操作符号。或者,您可以在此程序包中直接调用方法来读取、创建和删除符号。

绑定哈希接口

此接口允许您将 DCL 符号表视为 Perl 关联数组,其中每个元素的键是符号名称,而元素的值是该符号的值。键字符串中的大小写不重要,因为 DCL 将符号名称转换为大写,但它在值字符串中很重要。支持关联数组的所有常规操作。读取元素会检索符号的当前值,赋值给它会定义一个新符号(或覆盖现有符号的旧值),而删除元素会删除相应的符号。将元素设置为 undef,或直接将其取消定义,会将相应的符号设置为 null 字符串。您还可以读取特殊键“:GLOBAL”和“:LOCAL”,以了解是否已为此哈希指定默认符号表(请参阅下一段),或设置这两个键中的任何一个以指定默认符号表。

当您调用 tie 函数将关联数组绑定到此包时,您可以指定一个可选参数,即您希望在其中创建和删除符号的符号表。如果参数是字符串“GLOBAL”,则使用全局符号表;任何其他字符串都会导致使用本地符号表。请注意,此参数不会影响读取符号的尝试;如果本地符号表中存在具有指定名称的符号,则始终优先于全局符号表中具有相同名称的符号返回该符号。

对象接口

尽管在某些方面不如绑定的哈希接口方便,但您也可以直接调用方法来操作各个符号。在某些情况下,这允许您比使用绑定的哈希聚合进行更精细的控制。支持以下方法

new

这将创建一个 VMS::DCLsym 对象,该对象可以用作以后方法调用的句柄。单个可选参数指定在以后的方法调用中默认使用的符号表,与上面描述的 tie 的可选参数相同。

getsym

如果在标量上下文中调用,getsym 将返回以调用参数形式给出的名称的符号的值,或者如果不存在此类符号,则返回 undef。本地符号表中的符号始终优先于全局符号表中的符号。如果在列表上下文中调用,getsym 将返回一个包含两个元素的列表,其第一个元素是符号的值,其第二个元素是字符串“GLOBAL”或“LOCAL”,指示从哪个表读取符号的值。

setsym

此方法采用的前两个参数是符号名称和应分配给它的值。可选的第三个参数是一个指定要使用的符号表的字符串;“GLOBAL”指定全局符号表,任何其他字符串指定本地符号表。如果省略此参数,则使用对象的默认符号表。setsym 在成功时返回 TRUE,否则返回 FALSE。

delsym

此方法删除名称作为第一个参数提供的符号。可选的第二个参数指定符号表,如上文 setsym 中所述。如果成功删除符号,则返回 TRUE,否则返回 FALSE。

clearcache

由于与获取已定义符号列表以用于绑定的哈希迭代器相关联的开销,因此仅执行一次,并且列表将重复用于后续迭代。通过此软件包进行的符号更改将被记录,但在极少数情况下,如果有人从外部更改进程的符号表(使用网络上的某些软件时有可能),则迭代器将与符号表不同步。如果您希望发生这种情况,可以通过调用此方法重置缓存。此外,如果您将 FALSE 值作为第一个参数传递,则将禁用缓存。稍后可以通过将 TRUE 值作为第一个参数再次调用 clearcache 来重新启用它。它分别返回 TRUE 或 FALSE 以指示缓存之前是否已启用或禁用。

此方法是一个权宜之计,直到我们能够将代码合并到此扩展中以直接遍历进程的符号表,因此它可能会在此软件包的未来版本中消失。

作者

Charles Bailey [email protected]

版本

1.09

错误

迭代器的符号列表是通过生成一个子进程来组装的,这可能会很慢。理想情况下,我们应该直接从 C 遍历进程的符号表。