内容

名称

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 不导出任何子例程。

核心 Perl builtin 函数

此模块中的许多函数已成为最近 Perl 版本中一项新的实验性功能的灵感来源。从 5.35.7 开始的各种开发版本中,builtin:: 包中提供了与许多这些实用程序等效的函数。

use Scalar::Util qw(blessed);

$class = blessed $obj;

$class = builtin::blessed $obj;  # equivalent

有关更多信息,请参阅有关 builtin 的文档。

引用函数

以下函数都在引用值上执行一些有用的操作。

blessed

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

refaddr

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

reftype

my $type = reftype( $ref );

如果 $ref 是一个引用,则返回所引用变量的基本 Perl 类型,表示为一个普通字符串(例如 ARRAYHASH)。否则返回 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

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

unweaken( $ref );

从版本 1.36 开始。

左值 REF 将从弱引用变回普通(强)引用。此函数会修改作为参数传递的左值,但不返回值。这会撤销由 "weaken" 执行的操作。

此函数比其他等效代码更简洁、更方便

my $tmp = $REF;
undef $REF;
$REF = $tmp;

(因为特别是,简单地将弱引用重新分配给自己并不能解除弱引用;$REF = $REF 不起作用)。

从 Perl 版本 5.35.7 开始,可以使用等效函数 builtin::unweaken

isweak

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

其他函数

dualvar

my $var = dualvar( $num, $string );

返回一个标量,在数值上下文中值为 $num,在字符串上下文中值为 $string

$foo = dualvar 10, "Hello";
$num = $foo + 2;                    # 12
$str = $foo . " world";             # Hello world

isdual

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 中的独立概念,而是所有标量值的标准内部结构。通过正常的操作过程,几乎任何值都可以被此函数视为双值变量。

isvstring

my $vstring = isvstring( $var );

如果 $var 是一个被编码为 vstring 的标量,则结果为 true。

$vs   = v49.46.48;
$fmt  = isvstring($vs) ? "%vd" : "%s"; #true
printf($fmt,$vs);

looks_like_number

my $isnum = looks_like_number( $var );

如果 Perl 认为 $var 是一个数字,则返回 true。请参阅 "perlapi 中的 looks_like_number"

openhandle

my $fh = openhandle( $fh );

如果 $fh 可以用作文件句柄并且已打开,或者它是一个绑定句柄,则返回 $fh 本身。否则返回 undef

$fh = openhandle(*STDIN);           # \*STDIN
$fh = openhandle(\*STDIN);          # \*STDIN
$fh = openhandle(*NOTOPEN);         # undef
$fh = openhandle("scalar");         # undef

readonly

my $ro = readonly( $var );

如果 $var 是只读的,则返回 true。

sub foo { readonly($_[0]) }

$readonly = foo($bar);              # false
$readonly = foo(0);                 # true

set_prototype

my $code = set_prototype( $code, $prototype );

设置由 $code 引用给出的函数的原型,或者如果 $prototypeundef 则删除它。返回 $code 引用本身。

set_prototype \&foo, '$$';

tainted

my $t = tainted( $var );

如果 $var 被污染,则返回 true。

$taint = tainted("constant");       # false
$taint = tainted($ENV{PWD});        # true if running under -T

DIAGNOSTICS

模块使用可能会在导入期间给出以下错误之一。

此版本的 perl 未实现 Vstrings

您正在使用的 perl 版本未实现 Vstrings,要使用 "isvstring",您需要使用更新版本的 perl。

已知错误

perl5.6.0 中存在一个与大于等于 1<<31 的 UV 相关的错误。这将显示为 dualvar.t 的测试 8 和 9 失败。

另请参阅

List::Util

COPYRIGHT

版权所有 (c) 1997-2007 Graham Barr <[email protected]>。保留所有权利。本程序是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。

此外,"weaken""isweak"

版权所有 (c) 1999 Tuomas J. Lukka <[email protected]>。保留所有权利。本程序是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。

版权所有 (C) 2004, 2008 Matthijs van Duin。保留所有权利。版权所有 (C) 2014 cPanel Inc. 保留所有权利。本程序是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。