Scalar::Util - 一组通用的标量子程序
use Scalar::Util qw(blessed dualvar isdual readonly refaddr reftype
tainted weaken isweak isvstring looks_like_number
set_prototype);
# and other useful utils appearing below
Scalar::Util
包含一些子程序,人们认为这些子程序应该在 Perl 内核中,但使用频率不够高,不值得使用关键字,而且体积很小,单独扩展会很浪费。
默认情况下,Scalar::Util
不导出任何子例程。
builtin
函数此模块中的许多函数已成为最近 Perl 版本中一项新的实验性功能的灵感来源。从 5.35.7 开始的各种开发版本中,builtin::
包中提供了与许多这些实用程序等效的函数。
use Scalar::Util qw(blessed);
$class = blessed $obj;
$class = builtin::blessed $obj; # equivalent
有关更多信息,请参阅有关 builtin 的文档。
以下函数都在引用值上执行一些有用的操作。
my $pkg = blessed( $ref );
如果 $ref
是一个已祝福的引用,则返回它被祝福到的包的名称。否则返回 undef
。
$scalar = "foo";
$class = blessed $scalar; # undef
$ref = [];
$class = blessed $ref; # undef
$obj = bless [], "Foo";
$class = blessed $obj; # "Foo"
在简单地将此函数用作真值测试时(例如在 if(blessed $ref)...
中)要小心,因为包名 "0"
已定义但为假。
自 Perl 版本 5.35.7 起,一个等效的函数可用作 builtin::blessed
。
my $addr = refaddr( $ref );
如果 $ref
是引用,则返回所引用值的内部内存地址,表示为一个普通整数。否则返回 undef
。
$addr = refaddr "string"; # undef
$addr = refaddr \$var; # eg 12345678
$addr = refaddr []; # eg 23456784
$obj = bless {}, "Foo";
$addr = refaddr $obj; # eg 88123488
自 Perl 版本 5.35.7 起,一个等效的函数可用作 builtin::refaddr
。
my $type = reftype( $ref );
如果 $ref
是一个引用,则返回所引用变量的基本 Perl 类型,表示为一个普通字符串(例如 ARRAY
或 HASH
)。否则返回 undef
。
$type = reftype "string"; # undef
$type = reftype \$var; # SCALAR
$type = reftype []; # ARRAY
$obj = bless {}, "Foo";
$type = reftype $obj; # HASH
请注意,出于内部原因,所有预编译的正则表达式 (qr/.../
) 都是已祝福的引用;因此,ref()
在这些表达式上返回包名字符串 "Regexp"
,但 reftype()
将返回底层 C 结构类型 "REGEXP"
,全部大写。
自 Perl 版本 5.35.7 起,一个等效的函数可用作 builtin::reftype
。
weaken( $ref );
左值 $ref
将被转换为弱引用。这意味着它不会在它引用的对象上保留引用计数。此外,当该对象的引用计数达到零时,该引用将被设置为 undef。此函数会修改作为其参数传递的左值,并且不返回值。
这对于保留引用的副本很有用,但您不想阻止对象在通常的时间被 DESTROY。
{
my $var;
$ref = \$var;
weaken($ref); # Make $ref a weak reference
}
# $ref is now undef
请注意,如果您复制具有弱引用的标量,则副本将是强引用。
my $var;
my $foo = \$var;
weaken($foo); # Make $foo a weak reference
my $bar = $foo; # $bar is now a strong reference
这在其他情况下可能不太明显,例如 grep()
,例如在遍历可能已被销毁的对象的弱引用列表时。
@object = grep { defined } @object;
这确实会删除对已销毁对象的引用,但对对象的剩余引用将变为强引用,导致剩余对象永远不会被销毁,因为现在在 @object 数组中始终存在对它们的强引用。
从 Perl 版本 5.35.7 开始,可以使用等效函数 builtin::weaken
。
unweaken( $ref );
从版本 1.36 开始。
左值 REF
将从弱引用变回普通(强)引用。此函数会修改作为参数传递的左值,但不返回值。这会撤销由 "weaken" 执行的操作。
此函数比其他等效代码更简洁、更方便
my $tmp = $REF;
undef $REF;
$REF = $tmp;
(因为特别是,简单地将弱引用重新分配给自己并不能解除弱引用;$REF = $REF
不起作用)。
从 Perl 版本 5.35.7 开始,可以使用等效函数 builtin::unweaken
。
my $weak = isweak( $ref );
如果 $ref
是弱引用,则返回 true。
$ref = \$foo;
$weak = isweak($ref); # false
weaken($ref);
$weak = isweak($ref); # true
注意:复制弱引用会创建一个普通的强引用。
$copy = $ref;
$weak = isweak($copy); # false
从 Perl 版本 5.35.7 开始,可以使用等效函数 builtin::is_weak
。
my $var = dualvar( $num, $string );
返回一个标量,在数值上下文中值为 $num
,在字符串上下文中值为 $string
。
$foo = dualvar 10, "Hello";
$num = $foo + 2; # 12
$str = $foo . " world"; # Hello world
my $dual = isdual( $var );
从版本 1.26 开始。
如果 $var
是一个同时具有数值和字符串值的标量,则结果为 true。
$foo = dualvar 86, "Nix";
$dual = isdual($foo); # true
请注意,标量可以通过标准操作获得字符串和数值内容
$foo = "10";
$dual = isdual($foo); # false
$bar = $foo + 0;
$dual = isdual($foo); # true
$!
变量通常是双值变量,但它在其他方面也是神奇的
$! = 1;
$dual = isdual($!); # true
print("$!\n"); # "Operation not permitted"
警告:此函数并不像看起来那么有用。双值变量不是 Perl 中的独立概念,而是所有标量值的标准内部结构。通过正常的操作过程,几乎任何值都可以被此函数视为双值变量。
my $vstring = isvstring( $var );
如果 $var
是一个被编码为 vstring 的标量,则结果为 true。
$vs = v49.46.48;
$fmt = isvstring($vs) ? "%vd" : "%s"; #true
printf($fmt,$vs);
my $isnum = looks_like_number( $var );
如果 Perl 认为 $var
是一个数字,则返回 true。请参阅 "perlapi 中的 looks_like_number"。
my $fh = openhandle( $fh );
如果 $fh
可以用作文件句柄并且已打开,或者它是一个绑定句柄,则返回 $fh
本身。否则返回 undef
。
$fh = openhandle(*STDIN); # \*STDIN
$fh = openhandle(\*STDIN); # \*STDIN
$fh = openhandle(*NOTOPEN); # undef
$fh = openhandle("scalar"); # undef
my $ro = readonly( $var );
如果 $var
是只读的,则返回 true。
sub foo { readonly($_[0]) }
$readonly = foo($bar); # false
$readonly = foo(0); # true
my $code = set_prototype( $code, $prototype );
设置由 $code
引用给出的函数的原型,或者如果 $prototype
是 undef
则删除它。返回 $code
引用本身。
set_prototype \&foo, '$$';
my $t = tainted( $var );
如果 $var
被污染,则返回 true。
$taint = tainted("constant"); # false
$taint = tainted($ENV{PWD}); # true if running under -T
模块使用可能会在导入期间给出以下错误之一。
您正在使用的 perl 版本未实现 Vstrings,要使用 "isvstring",您需要使用更新版本的 perl。
perl5.6.0 中存在一个与大于等于 1<<31 的 UV 相关的错误。这将显示为 dualvar.t 的测试 8 和 9 失败。
版权所有 (c) 1997-2007 Graham Barr <[email protected]>。保留所有权利。本程序是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。
版权所有 (c) 1999 Tuomas J. Lukka <[email protected]>。保留所有权利。本程序是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。
版权所有 (C) 2004, 2008 Matthijs van Duin。保留所有权利。版权所有 (C) 2014 cPanel Inc. 保留所有权利。本程序是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。