This is probably overkill, but you can create a tied object wrapper to do the look ups. This will be a bit slow, but if you dont need speed, it might be interesting to look at.
use strict;
my $str = "foobar";
my $c = MyConstants->new();
print "str = $str\n";
$str =~ s/$c->{Foo}/$c->{Bar}/;
print "str = $str\n";
print "Bar = $c->{bar}";
package MyConstants;
use constant Foo => "foo";
use constant Bar => "bar";
use Tie::Hash;
use base qw(Tie::StdHash);
use Carp qw(croak);
sub new {
tie my %self, $_[0];
return bless \%self, $_[0];
}
sub FETCH {
if( $_[0]->can($_[1]) ) {
goto &{$_[1]};
} else {
croak("Undefined constant \"$_[1]\" called");
}
}
results:
str = foobar
str = barbar
Undefined constant "bar" called at /tmp/test.pl line 8