* shmem <[EMAIL PROTECTED]> [2007-12-10 12:55]: > Well, if we were to return an array reference instead of a hash > ref, > > sub [EMAIL PROTECTED],shift} > > works. Why does the shift get executed before an array > reference is constructed - but not if a hashref is constructed > - from an array?
It probably doesn’t. Either way, evaluation order is a red herring: your construction will work regardless of which subexpression is evaluated first! You managed to confuse yourself. Congratulations. :-) (Or you are underhandedly trying to confuse us. In that case, sorry bub, better luck next time. :-) ) What happens is that `\` takes a *reference* to the array. And of course when you do that, any modifications of the referent, including *subsequent* modifications, will be seen by anyone who holds a reference to it. In contrast, the hash constructors make a *copy* of the array, and that copy will not be affected but subsequent modifications to the source array. Anyone who has trouble following should consider the difference between the following two: sub new { bless [EMAIL PROTECTED], shift } # vs sub new { bless [EMAIL PROTECTED], shift } Consider how many arrays are involved in either case, and which one is affected by the `shift`. -- *AUTOLOAD=*_;sub _{s/(.*)::(.*)/print$2,(",$\/"," ")[defined wantarray]/e;$1} &Just->another->Perl->hack; #Aristotle Pagaltzis // <http://plasmasturm.org/>