Ionic has asked for the wisdom of the Perl Monks concerning the following question:
I'm trying to create a read-only "multi-dimensional" constant using the built-in constant pragma. I know that there's the Readonly module (amongst others), but I'm trying to stick to basics.
Using anonymous list references doesn't really work, because they can be modified, as documented:
Even though a reference may be declared as a constant, the reference may point to data which may be changed, as this code shows.
use constant ARRAY => [ 1,2,3,4 ]; print ARRAY->[1]; ARRAY->[1] = " be changed"; print ARRAY->[1];
Okay, so I'll use some sort of indirection, I thought, and came up with something like this:
… but, this doesn't quite do what I expected. Output:use strict; use warnings; use Data::Dumper; use constant INVALID_DATA => ( q{invalid}, 0 ); use constant ADD_DATA => ( q{add}, 1 ); use constant REMOVE_DATA => ( q{remove}, 2 ); use constant MODES => ( \&ADD_DATA, \&REMOVE_DATA ); print {*STDERR} "Dumping MODES: " . Dumper ((MODES)); 1;
I was under the impression that constants are really subs that I could take the reference of, but this doesn't seem to be the case.Dumping MODES: $VAR1 = sub { "DUMMY" }; $VAR2 = sub { "DUMMY" };
Alternatively, I've tried taking direct references, but this is... just merging the lists (which is obviously bad to begin with and what I wanted to avoid by using references) in a weird "reference all elements individually" way:
leading touse constant MODES => ( \ADD_DATA, \REMOVE_DATA );
Dumping MODES: $VAR1 = \'add'; $VAR2 = \1; $VAR3 = \'remove'; $VAR4 = \2;
Is there any proper way to do this?