Dan Muey wrote:

> 
> Howdy,
> 
> I read in an earlier email that some people put _ in front of
> variables/function/etc to show that they are "important and should be
> handled by the program only" and it said that some "modules enforce this"
> 
> I guess what I'm getting at is:
> 
> If my module exports variables can I make it so they can't be changed?
> 
> IE
> 
>  use MyStuff qw($_joe $_mama); # now they should have $_joe and $_mama
>  exported from the module.
> 
>  print "$_joe $_mama\n"; # ok
>  my $joe = $_joe;        # ok
> $joe =~ s/\W//g;   # ok
>  $_joe = "new value";    # bad - not allowed - maybe give warning?
>  $_mama =~ s/\W//g;      # bad - not allowed - maybe give warning?
> 
> If so hwo do I do it or what module protects its variables in this way so
> I can look at it's code for an example or documentation???

a lot of people have suggested using closures which is nice. another appoach 
is to use tie. simple example:

package ConVar;

sub TIESCALAR{
        my $class = shift;
        my $value = shift;
        return bless \$value => $class;
}

sub FETCH{ ${$_[0]} }

#--
#-- variable that can't be changed
#--
sub STORE{ warn("modification is not allowed\n") }

1;

__END__

package MyModule;
use Exporter;
use ConVar;
our @ISA=qw(Exporter);
our @EXPORT_OK = qw($var1 $var2); #-- export read only

#--
#--  your module implementing the read only variable
#--
tie our $var1,'ConVar',5;
tie our $var2,'ConVar',6;

1;

__END__

#!/usr/bin/perl -w
use strict;
use MyModule qw($var1 $var2);

#--
#-- testing the read only variable
#--
$var1 = 7;
$var2 = 8;
print "$var1\n";
print "$var2\n";

__END__

prints:

modification is not allowed
modification is not allowed
5
6

notes:
* the code is, generally speaking and imo, cleaner.
* user notice no differences (except when they start benchmark their script) 
whether $var1 has magic behind it or not.
* you can tie anything (array, hash ref, or another object) behind the 
simple scalar interface and it still looks like a simple variable to the 
users of your module.
* it's slower than the other method. probably 10 times
* it's not very secure. for example:

my $g = tied $var1;
$$g = 10;
print "$var1\n"; #-- $var1 is now 10.

other tricks and readings can be found at:

perldoc -f tie
perldoc perltie

david

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to