in reply to Re: Import constants as scalar instead of bareword sub
in thread Import constants as scalar instead of bareword sub
You can make $EINTR a constant with:but that kind of thing is not always portable between systems. Because the value must be a reference to a literal in source, afaik that would require some kind of source filter to get portability.*EINTR = \4;
Out of curiousity, I'd like to understand better why you think this isn't portable? The value could also be a reference to a literal in an eval, not just the source itself. For example, here's a quick test I wrote (without the kind of robust error checking on the inputs that I'd write for a real module, of course.)
ConstantVars.pm
package ConstantVars; use strict; use warnings; sub import { my $package = shift; die "Odd number of arguments to ConstantVars" if ! @_ % 2; my %constants = @_; my $caller = caller; while (my ($key,$value) = each %constants) { eval qq( *${caller}::${key} = \\"${value}" ); } } 1;
test_constants.pl:
use strict; use warnings; use ConstantVars ( PI => 3.14159, VERSION => 1.01, ); print "PI is $PI in version $VERSION\n";
Prints:
PI is 3.14159 in version 1.01
-xdg
Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.
|
|---|