It all depends where you've declared e.g.
%working_dir_of:
{
my %working_dir_of;
}
sub get {
...
}
won't work, but
my %working_dir_of;
sub get {
...
}
does: accessor and declaration have to be in the same scope. In principle, the string eval technique works, as seen with this snippet
#!/usr/bin/perl
use strict;
my %hash = ( foo => 'bar');
sub meth {
my ($h,$k) = @_;
my $string = sprintf 'print $%s{%s},"\n"', $h, $k;
eval $string;
};
meth('hash','foo');
__END__
bar
but it looks a bit whacky and eval is costly, too. Why is it deemed good practice to name an attribute e.g. dbh
and the corresponding inside out attribute hash %dbh_of ? Looks to me like calling for trouble.
If you want to stick with that "good practice", I'd recommend to set up a property hash keyed by the real attribute
names, and having as values references to the attribute hashes:
my( %dbh_of, %dir_of, ...);
my %props = (
dbh => \%dbh_of,
dir => \%dir_of,
...
);
sub get {
my($self,$attr) = @_;
my $return_val;
# if valid attribute, return the object's value
if( defined $props {$attr} ) {
return $props {$attr} -> { refaddr $self};
}
# otherwise, carp a warning
else {
carp("Invalid attribute '$attr'");
}
}
Note that I've dropped the return value in case of failure; returning nothing at all in this case is better than
returning an undefined value IMHO.
Have a look at Alter for a simpler, faster and cleaner approach to insiteoudish object data encapsulation (e.g. no hassle with DESTROY).
--shmem
_($_=" "x(1<<5)."?\n".q·/)Oo. G°\ /
/\_¯/(q /
---------------------------- \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.