1 # Copyright (c) 1997-2007 Graham Barr <gbarr@pobox.com>. All rights reserved.
2 # This program is free software; you can redistribute it and/or
3 # modify it under the same terms as Perl itself.
5 # Maintained since 2013 by Paul Evans <leonerd@leonerd.org.uk>
13 our @ISA = qw(Exporter);
15 blessed refaddr reftype weaken unweaken isweak
17 dualvar isdual isvstring looks_like_number openhandle readonly set_prototype
20 our $VERSION = "1.46";
21 $VERSION = eval $VERSION;
23 require List::Util; # List::Util loads the XS
24 List::Util->VERSION( $VERSION ); # Ensure we got the right XS version (RT#100863)
28 unless (defined &weaken) {
29 push @EXPORT_FAIL, qw(weaken);
31 unless (defined &isweak) {
32 push @EXPORT_FAIL, qw(isweak isvstring);
34 unless (defined &isvstring) {
35 push @EXPORT_FAIL, qw(isvstring);
39 if (grep { /^(?:weaken|isweak)$/ } @_ ) {
41 Carp::croak("Weak references are not implemented in the version of perl");
44 if (grep { /^isvstring$/ } @_ ) {
46 Carp::croak("Vstrings are not implemented in the version of perl");
52 # set_prototype has been moved to Sub::Util with a different interface
55 my ( $code, $proto ) = @_;
56 return Sub::Util::set_prototype( $proto, $code );
65 Scalar::Util - A selection of general-utility scalar subroutines
69 use Scalar::Util qw(blessed dualvar isdual readonly refaddr reftype
70 tainted weaken isweak isvstring looks_like_number
72 # and other useful utils appearing below
76 C<Scalar::Util> contains a selection of subroutines that people have expressed
77 would be nice to have in the perl core, but the usage would not really be high
78 enough to warrant the use of a keyword, and the size would be so small that
79 being individual extensions would be wasteful.
81 By default C<Scalar::Util> does not export any subroutines.
85 =head1 FUNCTIONS FOR REFERENCES
87 The following functions all perform some useful activity on reference values.
91 my $pkg = blessed( $ref );
93 If C<$ref> is a blessed reference, the name of the package that it is blessed
94 into is returned. Otherwise C<undef> is returned.
97 $class = blessed $scalar; # undef
100 $class = blessed $ref; # undef
102 $obj = bless [], "Foo";
103 $class = blessed $obj; # "Foo"
105 Take care when using this function simply as a truth test (such as in
106 C<if(blessed $ref)...>) because the package name C<"0"> is defined yet false.
110 my $addr = refaddr( $ref );
112 If C<$ref> is reference, the internal memory address of the referenced value is
113 returned as a plain integer. Otherwise C<undef> is returned.
115 $addr = refaddr "string"; # undef
116 $addr = refaddr \$var; # eg 12345678
117 $addr = refaddr []; # eg 23456784
119 $obj = bless {}, "Foo";
120 $addr = refaddr $obj; # eg 88123488
124 my $type = reftype( $ref );
126 If C<$ref> is a reference, the basic Perl type of the variable referenced is
127 returned as a plain string (such as C<ARRAY> or C<HASH>). Otherwise C<undef>
130 $type = reftype "string"; # undef
131 $type = reftype \$var; # SCALAR
132 $type = reftype []; # ARRAY
134 $obj = bless {}, "Foo";
135 $type = reftype $obj; # HASH
141 The lvalue C<$ref> will be turned into a weak reference. This means that it
142 will not hold a reference count on the object it references. Also, when the
143 reference count on that object reaches zero, the reference will be set to
144 undef. This function mutates the lvalue passed as its argument and returns no
147 This is useful for keeping copies of references, but you don't want to prevent
148 the object being DESTROY-ed at its usual time.
153 weaken($ref); # Make $ref a weak reference
157 Note that if you take a copy of a scalar with a weakened reference, the copy
158 will be a strong reference.
162 weaken($foo); # Make $foo a weak reference
163 my $bar = $foo; # $bar is now a strong reference
165 This may be less obvious in other situations, such as C<grep()>, for instance
166 when grepping through a list of weakened references to objects that may have
167 been destroyed already:
169 @object = grep { defined } @object;
171 This will indeed remove all references to destroyed objects, but the remaining
172 references to objects will be strong, causing the remaining objects to never be
173 destroyed because there is now always a strong reference to them in the @object
180 I<Since version 1.36.>
182 The lvalue C<REF> will be turned from a weak reference back into a normal
183 (strong) reference again. This function mutates the lvalue passed as its
184 argument and returns no value. This undoes the action performed by
187 This function is slightly neater and more convenient than the
188 otherwise-equivalent code
194 (because in particular, simply assigning a weak reference back to itself does
195 not work to unweaken it; C<$REF = $REF> does not work).
199 my $weak = isweak( $ref );
201 Returns true if C<$ref> is a weak reference.
204 $weak = isweak($ref); # false
206 $weak = isweak($ref); # true
208 B<NOTE>: Copying a weak reference creates a normal, strong, reference.
211 $weak = isweak($copy); # false
213 =head1 OTHER FUNCTIONS
217 my $var = dualvar( $num, $string );
219 Returns a scalar that has the value C<$num> in a numeric context and the value
220 C<$string> in a string context.
222 $foo = dualvar 10, "Hello";
223 $num = $foo + 2; # 12
224 $str = $foo . " world"; # Hello world
228 my $dual = isdual( $var );
230 I<Since version 1.26.>
232 If C<$var> is a scalar that has both numeric and string values, the result is
235 $foo = dualvar 86, "Nix";
236 $dual = isdual($foo); # true
238 Note that a scalar can be made to have both string and numeric content through
242 $dual = isdual($foo); # false
244 $dual = isdual($foo); # true
246 Note that although C<$!> appears to be a dual-valued variable, it is
247 actually implemented as a magical variable inside the interpreter:
250 print("$!\n"); # "Operation not permitted"
251 $dual = isdual($!); # false
253 You can capture its numeric and string content using:
255 $err = dualvar $!, $!;
256 $dual = isdual($err); # true
260 my $vstring = isvstring( $var );
262 If C<$var> is a scalar which was coded as a vstring, the result is true.
265 $fmt = isvstring($vs) ? "%vd" : "%s"; #true
268 =head2 looks_like_number
270 my $isnum = looks_like_number( $var );
272 Returns true if perl thinks C<$var> is a number. See
273 L<perlapi/looks_like_number>.
277 my $fh = openhandle( $fh );
279 Returns C<$fh> itself if C<$fh> may be used as a filehandle and is open, or is
280 is a tied handle. Otherwise C<undef> is returned.
282 $fh = openhandle(*STDIN); # \*STDIN
283 $fh = openhandle(\*STDIN); # \*STDIN
284 $fh = openhandle(*NOTOPEN); # undef
285 $fh = openhandle("scalar"); # undef
289 my $ro = readonly( $var );
291 Returns true if C<$var> is readonly.
293 sub foo { readonly($_[0]) }
295 $readonly = foo($bar); # false
296 $readonly = foo(0); # true
300 my $code = set_prototype( $code, $prototype );
302 Sets the prototype of the function given by the C<$code> reference, or deletes
303 it if C<$prototype> is C<undef>. Returns the C<$code> reference itself.
305 set_prototype \&foo, '$$';
309 my $t = tainted( $var );
311 Return true if C<$var> is tainted.
313 $taint = tainted("constant"); # false
314 $taint = tainted($ENV{PWD}); # true if running under -T
318 Module use may give one of the following errors during import.
322 =item Weak references are not implemented in the version of perl
324 The version of perl that you are using does not implement weak references, to
325 use L</isweak> or L</weaken> you will need to use a newer release of perl.
327 =item Vstrings are not implemented in the version of perl
329 The version of perl that you are using does not implement Vstrings, to use
330 L</isvstring> you will need to use a newer release of perl.
336 There is a bug in perl5.6.0 with UV's that are >= 1<<31. This will
337 show up as tests 8 and 9 of dualvar.t failing
345 Copyright (c) 1997-2007 Graham Barr <gbarr@pobox.com>. All rights reserved.
346 This program is free software; you can redistribute it and/or modify it
347 under the same terms as Perl itself.
349 Additionally L</weaken> and L</isweak> which are
351 Copyright (c) 1999 Tuomas J. Lukka <lukka@iki.fi>. All rights reserved.
352 This program is free software; you can redistribute it and/or modify it
353 under the same terms as perl itself.
355 Copyright (C) 2004, 2008 Matthijs van Duin. All rights reserved.
356 Copyright (C) 2014 cPanel Inc. All rights reserved.
357 This program is free software; you can redistribute it and/or modify
358 it under the same terms as Perl itself.