1#!./perl 2 3use strict; 4use warnings; 5 6use Scalar::Util qw(readonly); 7use Test::More tests => 11; 8 9ok( readonly(1), 'number constant'); 10 11my $var = 2; 12 13ok( !readonly($var), 'number variable'); 14is( $var, 2, 'no change to number variable'); 15 16ok( readonly("fred"), 'string constant'); 17 18$var = "fred"; 19 20ok( !readonly($var), 'string variable'); 21is( $var, 'fred', 'no change to string variable'); 22 23$var = \2; 24 25ok( !readonly($var), 'reference to constant'); 26ok( readonly($$var), 'de-reference to constant'); 27 28ok( !readonly(*STDOUT), 'glob'); 29 30sub try 31{ 32 my $v = \$_[0]; 33 return readonly $$v; 34} 35 36$var = 123; 37{ 38 # This used not to work with ithreads, but seems to be working since 5.19.3 39 local $TODO = ( $Config::Config{useithreads} && $] < 5.019003 ) ? 40 "doesn't work with threads" : undef; 41 ok( try ("abc"), 'reference a constant in a sub'); 42} 43ok( !try ($var), 'reference a non-constant in a sub'); 44