Slash Boxes
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
More | Login | Reply
Loading... please wait.
  • by pudge (1) on 2002.02.11 8:52 (#4325) Homepage Journal
    Data is in an object usually by saving it in the object variable. For example, most people most often use hashrefs as object data structures:

        sub new {
            my $class = shift;
            return bless {}, $class;

    Some people will just allow data access via this hash, directly:

        sub new {
            my $class = shift;
            return bless {blargh => 'data'}, $class;

    Then I could do my $foo = new Foo; print $foo->{blargh};, but that would be poor OOP design. We'd rather have $foo->method(). So to save data with a method, you can just do:

        sub set {
            my($self, $key, $data) = @_;
            $self->{_data}{$key} = $data;

    which gives us $foo->set('blargh', 'data'). And then to retrieve it:

        sub get {
        my($self, $key) = @_;
        return $self->{_data}{$key};

    which gives us print $foo->get('blargh'). Or usually better, an accessor method that does both:

        sub blargh {
            my($self, $val) = @_;
            $self->{_data}{blargh} = $val
                if defined $val;
            return $self->{_data}{blargh};

    That gives us $foo->blargh('data'); print $foo->blargh;. HTH.
    • I get everything except {_data}. I've never, never seen that before to the best of my recollection. Looking up {_data} came up blank in _Bookshelf_.

      So that I can look it up, what's that called?


      You are what you think.
      • _foo is a convention for "this is private, don't touch it." So by putting your data in the object hashref under the _data key, you are telling people who use the object and inspect its contents that they shouldn't touch that data directly, but access it via the published API.