📄 util.pm
字号:
# Scalar::Util.pm## Copyright (c) 1997-2005 Graham Barr <gbarr@pobox.com>. All rights reserved.# This program is free software; you can redistribute it and/or# modify it under the same terms as Perl itself.package Scalar::Util;use strict;use vars qw(@ISA @EXPORT_OK $VERSION);require Exporter;require List::Util; # List::Util loads the XS@ISA = qw(Exporter);@EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle refaddr isvstring looks_like_number set_prototype);$VERSION = "1.18";$VERSION = eval $VERSION;sub export_fail { if (grep { /^(weaken|isweak)$/ } @_ ) { require Carp; Carp::croak("Weak references are not implemented in the version of perl"); } if (grep { /^(isvstring)$/ } @_ ) { require Carp; Carp::croak("Vstrings are not implemented in the version of perl"); } if (grep { /^(dualvar|set_prototype)$/ } @_ ) { require Carp; Carp::croak("$1 is only avaliable with the XS version"); } @_;}sub openhandle ($) { my $fh = shift; my $rt = reftype($fh) || ''; return defined(fileno($fh)) ? $fh : undef if $rt eq 'IO'; if (reftype(\$fh) eq 'GLOB') { # handle openhandle(*DATA) $fh = \(my $tmp=$fh); } elsif ($rt ne 'GLOB') { return undef; } (tied(*$fh) or defined(fileno($fh))) ? $fh : undef;}eval <<'ESQ' unless defined &dualvar;use vars qw(@EXPORT_FAIL);push @EXPORT_FAIL, qw(weaken isweak dualvar isvstring set_prototype);# The code beyond here is only used if the XS is not installed# Hope nobody defines a sub by this namesub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }sub blessed ($) { local($@, $SIG{__DIE__}, $SIG{__WARN__}); length(ref($_[0])) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef}sub refaddr($) { my $pkg = ref($_[0]) or return undef; if (blessed($_[0])) { bless $_[0], 'Scalar::Util::Fake'; } else { $pkg = undef; } "$_[0]" =~ /0x(\w+)/; my $i = do { local $^W; hex $1 }; bless $_[0], $pkg if defined $pkg; $i;}sub reftype ($) { local($@, $SIG{__DIE__}, $SIG{__WARN__}); my $r = shift; my $t; length($t = ref($r)) or return undef; # This eval will fail if the reference is not blessed eval { $r->a_sub_not_likely_to_be_here; 1 } ? do { $t = eval { # we have a GLOB or an IO. Stringify a GLOB gives it's name my $q = *$r; $q =~ /^\*/ ? "GLOB" : "IO"; } or do { # OK, if we don't have a GLOB what parts of # a glob will it populate. # NOTE: A glob always has a SCALAR local *glob = $r; defined *glob{ARRAY} && "ARRAY" or defined *glob{HASH} && "HASH" or defined *glob{CODE} && "CODE" or length(ref(${$r})) ? "REF" : "SCALAR"; } } : $t}sub tainted { local($@, $SIG{__DIE__}, $SIG{__WARN__}); local $^W = 0; eval { kill 0 * $_[0] }; $@ =~ /^Insecure/;}sub readonly { return 0 if tied($_[0]) || (ref(\($_[0])) ne "SCALAR"); local($@, $SIG{__DIE__}, $SIG{__WARN__}); my $tmp = $_[0]; !eval { $_[0] = $tmp; 1 };}sub looks_like_number { local $_ = shift; # checks from perlfaq4 return 0 if !defined($_) or ref($_); return 1 if (/^[+-]?\d+$/); # is a +/- integer return 1 if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/); # a C float return 1 if ($] >= 5.008 and /^(Inf(inity)?|NaN)$/i) or ($] >= 5.006001 and /^Inf$/i); 0;}ESQ1;__END__=head1 NAMEScalar::Util - A selection of general-utility scalar subroutines=head1 SYNOPSIS use Scalar::Util qw(blessed dualvar isweak readonly refaddr reftype tainted weaken isvstring looks_like_number set_prototype);=head1 DESCRIPTIONC<Scalar::Util> contains a selection of subroutines that people haveexpressed would be nice to have in the perl core, but the usage wouldnot really be high enough to warrant the use of a keyword, and the sizeso small such that being individual extensions would be wasteful.By default C<Scalar::Util> does not export any subroutines. Thesubroutines defined are=over 4=item blessed EXPRIf EXPR evaluates to a blessed reference the name of the packagethat it is blessed into is returned. Otherwise C<undef> is returned. $scalar = "foo"; $class = blessed $scalar; # undef $ref = []; $class = blessed $ref; # undef $obj = bless [], "Foo"; $class = blessed $obj; # "Foo"=item dualvar NUM, STRINGReturns a scalar that has the value NUM in a numeric context and thevalue STRING in a string context. $foo = dualvar 10, "Hello"; $num = $foo + 2; # 12 $str = $foo . " world"; # Hello world=item isvstring EXPRIf EXPR is a scalar which was coded as a vstring the result is true. $vs = v49.46.48; $fmt = isvstring($vs) ? "%vd" : "%s"; #true printf($fmt,$vs);=item isweak EXPRIf EXPR is a scalar which is a weak reference the result is true. $ref = \$foo; $weak = isweak($ref); # false weaken($ref); $weak = isweak($ref); # trueB<NOTE>: Copying a weak reference creates a normal, strong, reference. $copy = $ref; $weak = isweak($ref); # false=item looks_like_number EXPRReturns true if perl thinks EXPR is a number. SeeL<perlapi/looks_like_number>.=item openhandle FHReturns FH if FH may be used as a filehandle and is open, or FH is a tiedhandle. Otherwise C<undef> is returned. $fh = openhandle(*STDIN); # \*STDIN $fh = openhandle(\*STDIN); # \*STDIN $fh = openhandle(*NOTOPEN); # undef $fh = openhandle("scalar"); # undef =item readonly SCALARReturns true if SCALAR is readonly. sub foo { readonly($_[0]) } $readonly = foo($bar); # false $readonly = foo(0); # true=item refaddr EXPRIf EXPR evaluates to a reference the internal memory address ofthe referenced value is returned. Otherwise C<undef> is returned. $addr = refaddr "string"; # undef $addr = refaddr \$var; # eg 12345678 $addr = refaddr []; # eg 23456784 $obj = bless {}, "Foo"; $addr = refaddr $obj; # eg 88123488=item reftype EXPRIf EXPR evaluates to a reference the type of the variable referencedis returned. Otherwise C<undef> is returned. $type = reftype "string"; # undef $type = reftype \$var; # SCALAR $type = reftype []; # ARRAY $obj = bless {}, "Foo"; $type = reftype $obj; # HASH=item set_prototype CODEREF, PROTOTYPESets the prototype of the given function, or deletes it if PROTOTYPE isundef. Returns the CODEREF. set_prototype \&foo, '$$';=item tainted EXPRReturn true if the result of EXPR is tainted $taint = tainted("constant"); # false $taint = tainted($ENV{PWD}); # true if running under -T=item weaken REFREF will be turned into a weak reference. This means that it will nothold a reference count on the object it references. Also when the referencecount on that object reaches zero, REF will be set to undef.This is useful for keeping copies of references , but you don't want toprevent the object being DESTROY-ed at its usual time. { my $var; $ref = \$var; weaken($ref); # Make $ref a weak reference } # $ref is now undefNote that if you take a copy of a scalar with a weakened reference,the copy will be a strong reference. my $var; my $foo = \$var; weaken($foo); # Make $foo a weak reference my $bar = $foo; # $bar is now a strong referenceThis may be less obvious in other situations, such as C<grep()>, for instancewhen grepping through a list of weakened references to objects that may havebeen destroyed already: @object = grep { defined } @object;This will indeed remove all references to destroyed objects, but the remainingreferences to objects will be strong, causing the remaining objects to neverbe destroyed because there is now always a strong reference to them in the@object array.=back=head1 KNOWN BUGSThere is a bug in perl5.6.0 with UV's that are >= 1<<31. This willshow up as tests 8 and 9 of dualvar.t failing=head1 COPYRIGHTCopyright (c) 1997-2005 Graham Barr <gbarr@pobox.com>. All rights reserved.This program is free software; you can redistribute it and/or modify itunder the same terms as Perl itself.Except weaken and isweak which areCopyright (c) 1999 Tuomas J. Lukka <lukka@iki.fi>. All rights reserved.This program is free software; you can redistribute it and/or modify itunder the same terms as perl itself.=head1 BLATANT PLUGThe weaken and isweak subroutines in this module and the patch to the core Perlwere written in connection with the APress book `Tuomas J. Lukka's DefinitiveGuide to Object-Oriented Programming in Perl', to avoid explaining why certainthings would have to be done in cumbersome ways.=cut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -