http://www.perlmonks.org?node_id=999810


in reply to Anonymous Hash in Constructor

... we make use of anonymous hash, whats the reason, why do we do that ...

tobyink has already pointed out and demonstrated that is is quite possible to create a named hash and then bless and return a reference to the hash as the object reference. But why is this not commonly done? The name of the referenced hash (or any other named data structure that might be used) is lost as soon as the constructor subroutine ends, and there is no way to ever access object data again except by reference, so there seems to be no point. The only reason I can think of to create and reference a named hash (or whatever structure) is self-documentation: a hash named  %attributes pretty much says it all, but one can do the same for an anonymous reference.

Replies are listed 'Best First'.
Re^2: Anonymous Hash in Constructor
by sundialsvc4 (Abbot) on Oct 18, 2012 at 20:25 UTC

    Of course, a local-variable is “lost” too, as soon as the containing subroutine (the constructor ...) ends.   So in this case, it really is a matter of personal preference on the part of the author.   You’re going to create something, you might or might not twiddle with it, you’re going to bless it, and then you’re going to return it as the function-result.   Q.E.D.   As long as the meaning of the block of code which you use to do that is abundantly obvious, and effortlessly maintainable, “Feel Free.™”

      Indeed. The two sample constructors I provided are functionally identical. If the Perl compiler were smart enough, it could happily generate the same optree from each (but it currently does not).

      perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'