in reply to Iterating over *any* thing in Perl

There is no such general function. And that's because there's no general way of creating an object. See, unlike normal languages, in Perl you have to do everything yourself when creating objects (which is very non-Perl). Some people use hashrefs or arrayrefs for their objects, and stuff all the attributes in the things the references point to (and those same people will vote '++' for if someone posts a coding guideline saying "Don't use global variables"). The advantage is that you can access the attributes all the time, from everywhere - the same advance as putting all your variables in main:: gives you.

But people preferring lexical variables over global variables; who think that encapsulation is a good thing, who simply think that variables should be appropriately scoped, or that it's nice to be able to inherit a class without having to peek inside it to do it properly, will hide the attributes, making them unaccessable from the outside.

So, no, you cannot do so.

Abigail

Replies are listed 'Best First'.
Re: Re: Iterating over *any* thing in Perl
by jryan (Vicar) on Dec 03, 2002 at 19:19 UTC
    Some people use hashrefs or arrayrefs for their objects, and stuff all the attributes in the things the references point to (and those same people will vote '++' for if someone posts a coding guideline saying "Don't use global variables"). The advantage is that you can access the attributes all the time, from everywhere - the same advance as putting all your variables in main:: gives you.

    What would you recommend should be done instead?

      Some options (in no particular order):

      • Use a proper OO language ;-)
      • Wait for Perl 6
      • Use inside out objects (for me, the neatest discovery from perlmonks so far - ++Abigail-II).
      • Hide your objects implementation behind a proxy object (Class::Delegation is handy for this sort of thing).
      • Document that you use a hash. Document the slot(s) that you use. One idiom that I've seen a few times is to do it as $object->{CLASS_NAME}->{SLOT_NAME}

      Any more for any more?