Sun::Solaris::Exacct 模块是由 libexacct(3LIB) 库所提供的所有类的父类。libexacct(3LIB) 提供对以下各种类型的实体的操作:exacct 格式文件、catalog 标记和 exacct 对象。exacct 对象会细分为两种类型。
项
单个数据值
组
项列表
扩展记帐的 Perl 扩展可为基础 libexacct(3LIB) API 提供 Perl 接口以及以下增强功能。
与 C API 完全等效,可提供在功能上与基础 C API 等效的 Perl 接口。
该接口提供了一种无需进行 C 编码即可访问的 exacct 文件的机制。所有在 C 中可以使用的功能也能借助 Perl 接口使用。
易于使用。
从基础 C API 获取的数据会表示为 Perl 数据类型。Perl 数据类型使数据访问更加容易,并且无需进行缓冲区压缩和解压缩操作。
自动内存管理。
C API 要求程序员在访问 exacct 文件时负责管理内存。内存管理采用的形式是将相应的标志传递给函数(如 ea_unpack_object(3EXACCT))并显式分配传递给 API 的缓冲区。Perl API 取消了这些要求,因为所有的内存管理都由 Perl 库执行。
防止错误地使用 API。
ea_object_t 结构提供了 exacct 记录在内存中的表示形式。ea_object_t 结构是用于处理组和项记录的联合类型。因此,类型不正确的结构可能会被传递给某些 API 函数。通过添加类分层结构可防止此类型的编程错误。
本文档中介绍的模块广泛使用 Perl 复合型标量功能。使用复合型标量功能可将标量值作为整数或字符串,具体取决于上下文。此行为与 $!Perl 变量 (errno) 表现的行为相同。复合型标量功能无需从整数值映射为对应的字符串即可显示值。以下示例说明了复合型标量的使用。
# Assume $obj is a Sun::Solaris::Item my $type = $obj->type(); # prints out "2 EO_ITEM" printf("%d %s\n", $type, $type); # Behaves as an integer, $i == 2 my $i = 0 + $type; # Behaves as a string, $s = "abc EO_ITEM xyx" my $s = "abc $type xyz";