use strict; use Carp; use Scalar::Util qw(readonly); sub ro { print "readonly($_[0])=".readonly($_[0])."\n"; $_[0] = 'xxx'; } eval { ro('lonely') } or print $@; eval { ro(named => 4); } or print $@; eval { ro(-named => 7); } or print $@; for (1..5) { # to test whether changing $_[0] affects the literal eval { ro(-loop => 7); } or print $@; } #### V:\>perl -MO=Deparse -e "%a = (-foo => 1);" (%a) = (-'foo', 1); -e syntax OK #### use strict; use Benchmark; sub woH { my %a = ( -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, -a => 1, ); return; } sub wH { my %a = ( '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, '-a' => 1, ); return; } timethese 100000, { woH => \&woH, wH => \&wH, } __END__ Benchmark: timing 100000 iterations of wH, woH... wH: 1 wallclock secs ( 1.45 usr + 0.00 sys = 1.45 CPU) @ 68917.99/s (n=100000) woH: 3 wallclock secs ( 2.39 usr + 0.00 sys = 2.39 CPU) @ 41893.59/s (n=100000) Benchmark: timing 100000 iterations of wH, woH... wH: 2 wallclock secs ( 1.47 usr + 0.01 sys = 1.48 CPU) @ 67521.94/s (n=100000) woH: 2 wallclock secs ( 2.32 usr + 0.02 sys = 2.34 CPU) @ 42735.04/s (n=100000) Benchmark: timing 100000 iterations of wH, woH... wH: 1 wallclock secs ( 1.42 usr + 0.00 sys = 1.42 CPU) @ 70472.16/s (n=100000) woH: 3 wallclock secs ( 2.56 usr + 0.00 sys = 2.56 CPU) @ 39077.76/s (n=100000) #### D:\>perl -MO=Deparse -e "print -'ahoj' => 1" print '-ahoj', 1; -e syntax OK D:\>perl -MO=Deparse -e "print -ahoj => 1" print -'ahoj', 1; -e syntax OK