Scalar::Util

简介

Scalar::Util 包含很多可选的、通用的、对标题进行处理的函数。其实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包时,默认情况下不会导入任何函数。

对引用进行操作的函数

blessed

my $pkg = blessed( $ref );

如果 $ref 是一个被 bless 过的引用,则返回它被 bless 的包的 包名。否则返回undef。

$scalar = "foo";
$class  = blessed $scalar;           # undef

$ref    = [];
$class  = blessed $ref;              # undef

$obj    = bless [], "Foo";
$class  = blessed $obj;              # "Foo"

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

reftype

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

weaken

weaken( $ref );

使用此函数对$ref进行处理后,$ref将会变成“弱引用”,这意味着它不会对引用的对象持有引用计数。此外,当该对象的引用计数达到零时,引用将被设置为undef。

此函数可以用来保持一个变量的 引用“副本”,但在原引用不存在之后,你将无法使用这个副本访问变量。

 {
   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;

unweaken

unweaken( $ref );

这个函数是weaken函数的逆函数。它会对一个“弱引用”进行“强化”。使用下面的代码可以达到同步的效果,但不如此函数代码整齐,并且语义清晰。

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

注意:把一个“弱引用”给自身赋值($ref = $ref;)并不能达到“强化”的目的。

isweak

my $weak = isweak( $ref );

如果 $ref 是一个弱引用,则返回true。否则返回false。

$ref  = \$foo;
$weak = isweak($ref);               # false
weaken($ref);
$weak = isweak($ref);               # true

注:用一个“弱引用”给另一个变量赋值,将得到一个“强引用”。

$copy = $ref;
$weak = isweak($copy);              # false

其他功能函数

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 );

如果变量$var同时具有数字和字符串值的标量,则结果为 true,否则返回false。

$foo = dualvar 86, "Nix";
$dual = isdual($foo);               # true

注:可以通过把字符串使用在数值上下文中使字符串变量成为一个 同时具有数字和字符串值的标量。同时也可以通过把数字使用在字符串上下文中使数字变量成为一个同时具有数字和字符串值的标量。

$foo = "10";
$dual = isdual($foo);               # false
$bar = $foo + 0;
$dual = isdual($foo);               # true

$foo = 10;
$dual = isdual($foo);               # false
$bar = $foo . "";
$dual = isdual($foo);               # true

注意:$! 似乎是一个双重值的变量,但它实际上是在解释器内部实现,并非一个真正的双重值变量。

$! = 1;
print("$!\n");                      # "Operation not permitted"
$dual = isdual($!);                 # false

isvstring

my $vstring = isvstring( $var );

如果 $var 是一个被编码为 vstring的标题,则返回true;否则返回false。

$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;否则返回false。

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;否则返回 false。

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

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

set_prototype

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

给一个$code引用设置 prototype,如果参数 $ptototype是undef 则会删除原$code引用上的 prototype。返回 $code 自身。

set_prototype \&foo, '$$';

tainted

my $t = tainted( $var );

如果$var 是 tainted 则返回true;否则返回 false。

$taint = tainted("constant");       # false
$taint = tainted($ENV{PWD});        # true if running under -T
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,498评论 1 51
  • 需求 设定一定范围的楼层奖 拉票和参与都得关注。 有个分享拉票的页面 有个中奖榜 场景 关注、退订。 分享页面(中...
    jaytags阅读 235评论 0 1
  • 董沛沛 洛阳 焦点网络五期坚持原创分享第六十六天 焦点解决治疗的目标架构: 一、是来访者想要的,对来访者重要的目标...
    缘源流长阅读 348评论 0 0