Yet Another syntactic variation would be something like:
Win8 Strawberry 5.8.9.5 (32) Sun 11/22/2020 3:11:34
C:\@Work\Perl\monks
>perl -l
use strict;
use warnings;
BEGIN {
my %ops = (
ADD_DATA => [ qw(add 1) ],
REMOVE_DATA => [ qw(remove 2) ],
);
sub valid (*) { return exists $ops{$_[0]}; }
sub modes (*) {
return valid($_[0]) ? [ @{ $ops{$_[0]} } ] : die "bad '$_[0]'"
+;
}
}
print 42 + modes(ADD_DATA) ->[1];
print 'foo' . modes('REMOVE_DATA')->[0];
print 'invalid' if not valid(yyy);
print modes('xxx');
^Z
43
fooremove
invalid
bad 'xxx' at - line 11.
If you don't like arrow notation and prefer something like
(...)[n], then:
Win8 Strawberry 5.8.9.5 (32) Sun 11/22/2020 3:14:57
C:\@Work\Perl\monks
>perl -l
use strict;
use warnings;
BEGIN {
my %ops = (
ADD_DATA => [ qw(add 1) ],
REMOVE_DATA => [ qw(remove 2) ],
);
sub valid (*) { return exists $ops{$_[0]}; }
sub modes (*) {
return valid($_[0]) ? @{ $ops{$_[0]} } : die "bad '$_[0]'";
}
}
print 42 + (modes ADD_DATA) [1];
print 'foo' . (modes 'REMOVE_DATA')[0];
print 'invalid' if not valid yyy;
print modes 'xxx';
^Z
43
fooremove
invalid
bad 'xxx' at - line 11.
In either case, the data in %ops is absolutely immutable.
Give a man a fish: <%-{-{-{-<