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 最近版本中新實驗設施的靈感。從各種開發版本(從 5.35.7 開始),builtin::
套件中提供了許多這些工具的等效函式。
use Scalar::Util qw(blessed);
$class = blessed $obj;
$class = builtin::blessed $obj; # equivalent
如需更多資訊,請參閱 builtin 文件。
以下函數皆對參考值執行一些有用的活動。
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
。
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/.../
)都是 blessed 參考;因此 ref()
會在這些參考上傳回套件名稱字串 "Regexp"
,但 reftype()
會傳回底層 C 結構類型 "REGEXP"
(全大寫)。
自 Perl 版本 5.35.7 起,一個等效的函數可用作 builtin::reftype
。
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( $ref );
自版本 1.36 起。
lvalue REF
將從弱參照轉回正常(強)參照。此函式會變異傳遞為其引數的 lvalue,且不傳回任何值。這會復原由 "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 版本未實作 Vstring,若要使用 "isvstring",您需要使用較新的 perl 版本。
perl5.6.0 中有一個錯誤,其中 UV 大於或等於 1<<31。這將顯示為 dualvar.t 的測試 8 和 9 失敗
版權所有 (c) 1997-2007 Graham Barr <gbarr@pobox.com>。保留所有權利。此程式是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
版權所有 (c) 1999 Tuomas J. Lukka <lukka@iki.fi>。保留所有權利。此程式是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
版權所有 (C) 2004, 2008 Matthijs van Duin。保留所有權利。版權所有 (C) 2014 cPanel Inc。保留所有權利。此程式是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。