Mortals are freeded at the next ";" or next "}" scope end. Not sure about scope opens("{"). DESTROYs will run when the ";" is executed, not at commas and not at sub calls (callee gets a new mortal scope, i am talking about caller scope) in the statement. This can cause headaches when you assign a new obj to a scalar that held a ref to an old obj, depending on the design of the class/api/library, the old obj can change global state set by new obj, so when you do something that involves global state, you wont see the action of new obj, but of old obj.