內容

名稱

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 內建核心函式

此模組中的許多函式已成為 Perl 最近版本中新實驗設施的靈感。從各種開發版本(從 5.35.7 開始),builtin:: 套件中提供了許多這些工具的等效函式。

use Scalar::Util qw(blessed);

$class = blessed $obj;

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

如需更多資訊,請參閱 builtin 文件。

REFERENCES 的函數

以下函數皆對參考值執行一些有用的活動。

blessed

my $pkg = blessed( $ref );

如果 $ref 是個 blessed 參考,它所 blessed 進去的套件名稱會被傳回。否則會傳回 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/.../)都是 blessed 參考;因此 ref() 會在這些參考上傳回套件名稱字串 "Regexp",但 reftype() 會傳回底層 C 結構類型 "REGEXP"(全大寫)。

自 Perl 版本 5.35.7 起,一個等效的函數可用作 builtin::reftype

weaken

weaken( $ref );

lvalue $ref 會被轉換成一個弱參考。這表示它不會持有它所參考的物件的參考計數。此外,當該物件的參考計數到達零時,該參考會被設為 undef。這個函數會改變傳遞為其參數的 lvalue,且不傳回任何值。

這對於保留參考的副本很有用,但你不想阻止物件在它通常的時間被 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(),例如在透過一個可能已被銷毀的物件的弱化參考清單進行 grep 時。

@object = grep { defined } @object;

這確實會移除所有對已銷毀物件的參照,但對物件的剩餘參照將會是強參照,導致剩餘物件永遠不會被銷毀,因為現在在 @object 陣列中總是有一個對它們的強參照。

自 Perl 版本 5.35.7 起,等效函式可用作 builtin::weaken

unweaken

unweaken( $ref );

自版本 1.36 起。

lvalue REF 將從弱參照轉回正常(強)參照。此函式會變異傳遞為其引數的 lvalue,且不傳回任何值。這會復原由 "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 未實作 Vstring

您使用的 perl 版本未實作 Vstring,若要使用 "isvstring",您需要使用較新的 perl 版本。

已知錯誤

perl5.6.0 中有一個錯誤,其中 UV 大於或等於 1<<31。這將顯示為 dualvar.t 的測試 8 和 9 失敗

另請參閱

List::Util

COPYRIGHT

版權所有 (c) 1997-2007 Graham Barr <gbarr@pobox.com>。保留所有權利。此程式是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。

此外,"weaken""isweak"

版權所有 (c) 1999 Tuomas J. Lukka <lukka@iki.fi>。保留所有權利。此程式是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。

版權所有 (C) 2004, 2008 Matthijs van Duin。保留所有權利。版權所有 (C) 2014 cPanel Inc。保留所有權利。此程式是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。