[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 # Scalar::Util.pm 2 # 3 # Copyright (c) 1997-2006 Graham Barr <gbarr@pobox.com>. All rights reserved. 4 # This program is free software; you can redistribute it and/or 5 # modify it under the same terms as Perl itself. 6 7 package Scalar::Util; 8 9 use strict; 10 use vars qw(@ISA @EXPORT_OK $VERSION); 11 require Exporter; 12 require List::Util; # List::Util loads the XS 13 14 @ISA = qw(Exporter); 15 @EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle refaddr isvstring looks_like_number set_prototype); 16 $VERSION = "1.19"; 17 $VERSION = eval $VERSION; 18 19 sub export_fail { 20 if (grep { /^(weaken|isweak)$/ } @_ ) { 21 require Carp; 22 Carp::croak("Weak references are not implemented in the version of perl"); 23 } 24 if (grep { /^(isvstring)$/ } @_ ) { 25 require Carp; 26 Carp::croak("Vstrings are not implemented in the version of perl"); 27 } 28 if (grep { /^(dualvar|set_prototype)$/ } @_ ) { 29 require Carp; 30 Carp::croak("$1 is only avaliable with the XS version"); 31 } 32 33 @_; 34 } 35 36 sub openhandle ($) { 37 my $fh = shift; 38 my $rt = reftype($fh) || ''; 39 40 return defined(fileno($fh)) ? $fh : undef 41 if $rt eq 'IO'; 42 43 if (reftype(\$fh) eq 'GLOB') { # handle openhandle(*DATA) 44 $fh = \(my $tmp=$fh); 45 } 46 elsif ($rt ne 'GLOB') { 47 return undef; 48 } 49 50 (tied(*$fh) or defined(fileno($fh))) 51 ? $fh : undef; 52 } 53 54 eval <<'ESQ' unless defined &dualvar; 55 56 use vars qw(@EXPORT_FAIL); 57 push @EXPORT_FAIL, qw(weaken isweak dualvar isvstring set_prototype); 58 59 # The code beyond here is only used if the XS is not installed 60 61 # Hope nobody defines a sub by this name 62 sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) } 63 64 sub blessed ($) { 65 local($@, $SIG{__DIE__}, $SIG{__WARN__}); 66 length(ref($_[0])) 67 ? eval { $_[0]->a_sub_not_likely_to_be_here } 68 : undef 69 } 70 71 sub refaddr($) { 72 my $pkg = ref($_[0]) or return undef; 73 if (blessed($_[0])) { 74 bless $_[0], 'Scalar::Util::Fake'; 75 } 76 else { 77 $pkg = undef; 78 } 79 "$_[0]" =~ /0x(\w+)/; 80 my $i = do { local $^W; hex $1 }; 81 bless $_[0], $pkg if defined $pkg; 82 $i; 83 } 84 85 sub reftype ($) { 86 local($@, $SIG{__DIE__}, $SIG{__WARN__}); 87 my $r = shift; 88 my $t; 89 90 length($t = ref($r)) or return undef; 91 92 # This eval will fail if the reference is not blessed 93 eval { $r->a_sub_not_likely_to_be_here; 1 } 94 ? do { 95 $t = eval { 96 # we have a GLOB or an IO. Stringify a GLOB gives it's name 97 my $q = *$r; 98 $q =~ /^\*/ ? "GLOB" : "IO"; 99 } 100 or do { 101 # OK, if we don't have a GLOB what parts of 102 # a glob will it populate. 103 # NOTE: A glob always has a SCALAR 104 local *glob = $r; 105 defined *glob{ARRAY} && "ARRAY" 106 or defined *glob{HASH} && "HASH" 107 or defined *glob{CODE} && "CODE" 108 or length(ref(${$r})) ? "REF" : "SCALAR"; 109 } 110 } 111 : $t 112 } 113 114 sub tainted { 115 local($@, $SIG{__DIE__}, $SIG{__WARN__}); 116 local $^W = 0; 117 eval { kill 0 * $_[0] }; 118 $@ =~ /^Insecure/; 119 } 120 121 sub readonly { 122 return 0 if tied($_[0]) || (ref(\($_[0])) ne "SCALAR"); 123 124 local($@, $SIG{__DIE__}, $SIG{__WARN__}); 125 my $tmp = $_[0]; 126 127 !eval { $_[0] = $tmp; 1 }; 128 } 129 130 sub looks_like_number { 131 local $_ = shift; 132 133 # checks from perlfaq4 134 return 0 if !defined($_) or ref($_); 135 return 1 if (/^[+-]?\d+$/); # is a +/- integer 136 return 1 if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/); # a C float 137 return 1 if ($] >= 5.008 and /^(Inf(inity)?|NaN)$/i) or ($] >= 5.006001 and /^Inf$/i); 138 139 0; 140 } 141 142 ESQ 143 144 1; 145 146 __END__ 147 148 =head1 NAME 149 150 Scalar::Util - A selection of general-utility scalar subroutines 151 152 =head1 SYNOPSIS 153 154 use Scalar::Util qw(blessed dualvar isweak readonly refaddr reftype tainted 155 weaken isvstring looks_like_number set_prototype); 156 157 =head1 DESCRIPTION 158 159 C<Scalar::Util> contains a selection of subroutines that people have 160 expressed would be nice to have in the perl core, but the usage would 161 not really be high enough to warrant the use of a keyword, and the size 162 so small such that being individual extensions would be wasteful. 163 164 By default C<Scalar::Util> does not export any subroutines. The 165 subroutines defined are 166 167 =over 4 168 169 =item blessed EXPR 170 171 If EXPR evaluates to a blessed reference the name of the package 172 that it is blessed into is returned. Otherwise C<undef> is returned. 173 174 $scalar = "foo"; 175 $class = blessed $scalar; # undef 176 177 $ref = []; 178 $class = blessed $ref; # undef 179 180 $obj = bless [], "Foo"; 181 $class = blessed $obj; # "Foo" 182 183 =item dualvar NUM, STRING 184 185 Returns a scalar that has the value NUM in a numeric context and the 186 value STRING in a string context. 187 188 $foo = dualvar 10, "Hello"; 189 $num = $foo + 2; # 12 190 $str = $foo . " world"; # Hello world 191 192 =item isvstring EXPR 193 194 If EXPR is a scalar which was coded as a vstring the result is true. 195 196 $vs = v49.46.48; 197 $fmt = isvstring($vs) ? "%vd" : "%s"; #true 198 printf($fmt,$vs); 199 200 =item isweak EXPR 201 202 If EXPR is a scalar which is a weak reference the result is true. 203 204 $ref = \$foo; 205 $weak = isweak($ref); # false 206 weaken($ref); 207 $weak = isweak($ref); # true 208 209 B<NOTE>: Copying a weak reference creates a normal, strong, reference. 210 211 $copy = $ref; 212 $weak = isweak($ref); # false 213 214 =item looks_like_number EXPR 215 216 Returns true if perl thinks EXPR is a number. See 217 L<perlapi/looks_like_number>. 218 219 =item openhandle FH 220 221 Returns FH if FH may be used as a filehandle and is open, or FH is a tied 222 handle. Otherwise C<undef> is returned. 223 224 $fh = openhandle(*STDIN); # \*STDIN 225 $fh = openhandle(\*STDIN); # \*STDIN 226 $fh = openhandle(*NOTOPEN); # undef 227 $fh = openhandle("scalar"); # undef 228 229 =item readonly SCALAR 230 231 Returns true if SCALAR is readonly. 232 233 sub foo { readonly($_[0]) } 234 235 $readonly = foo($bar); # false 236 $readonly = foo(0); # true 237 238 =item refaddr EXPR 239 240 If EXPR evaluates to a reference the internal memory address of 241 the referenced value is returned. Otherwise C<undef> is returned. 242 243 $addr = refaddr "string"; # undef 244 $addr = refaddr \$var; # eg 12345678 245 $addr = refaddr []; # eg 23456784 246 247 $obj = bless {}, "Foo"; 248 $addr = refaddr $obj; # eg 88123488 249 250 =item reftype EXPR 251 252 If EXPR evaluates to a reference the type of the variable referenced 253 is returned. Otherwise C<undef> is returned. 254 255 $type = reftype "string"; # undef 256 $type = reftype \$var; # SCALAR 257 $type = reftype []; # ARRAY 258 259 $obj = bless {}, "Foo"; 260 $type = reftype $obj; # HASH 261 262 =item set_prototype CODEREF, PROTOTYPE 263 264 Sets the prototype of the given function, or deletes it if PROTOTYPE is 265 undef. Returns the CODEREF. 266 267 set_prototype \&foo, '$$'; 268 269 =item tainted EXPR 270 271 Return true if the result of EXPR is tainted 272 273 $taint = tainted("constant"); # false 274 $taint = tainted($ENV{PWD}); # true if running under -T 275 276 =item weaken REF 277 278 REF will be turned into a weak reference. This means that it will not 279 hold a reference count on the object it references. Also when the reference 280 count on that object reaches zero, REF will be set to undef. 281 282 This is useful for keeping copies of references , but you don't want to 283 prevent the object being DESTROY-ed at its usual time. 284 285 { 286 my $var; 287 $ref = \$var; 288 weaken($ref); # Make $ref a weak reference 289 } 290 # $ref is now undef 291 292 Note that if you take a copy of a scalar with a weakened reference, 293 the copy will be a strong reference. 294 295 my $var; 296 my $foo = \$var; 297 weaken($foo); # Make $foo a weak reference 298 my $bar = $foo; # $bar is now a strong reference 299 300 This may be less obvious in other situations, such as C<grep()>, for instance 301 when grepping through a list of weakened references to objects that may have 302 been destroyed already: 303 304 @object = grep { defined } @object; 305 306 This will indeed remove all references to destroyed objects, but the remaining 307 references to objects will be strong, causing the remaining objects to never 308 be destroyed because there is now always a strong reference to them in the 309 @object array. 310 311 =back 312 313 =head1 KNOWN BUGS 314 315 There is a bug in perl5.6.0 with UV's that are >= 1<<31. This will 316 show up as tests 8 and 9 of dualvar.t failing 317 318 =head1 SEE ALSO 319 320 L<List::Util> 321 322 =head1 COPYRIGHT 323 324 Copyright (c) 1997-2006 Graham Barr <gbarr@pobox.com>. All rights reserved. 325 This program is free software; you can redistribute it and/or modify it 326 under the same terms as Perl itself. 327 328 Except weaken and isweak which are 329 330 Copyright (c) 1999 Tuomas J. Lukka <lukka@iki.fi>. All rights reserved. 331 This program is free software; you can redistribute it and/or modify it 332 under the same terms as perl itself. 333 334 =head1 BLATANT PLUG 335 336 The weaken and isweak subroutines in this module and the patch to the core Perl 337 were written in connection with the APress book `Tuomas J. Lukka's Definitive 338 Guide to Object-Oriented Programming in Perl', to avoid explaining why certain 339 things would have to be done in cumbersome ways. 340 341 =cut
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |