in reply to Dying and Swearing
Very good one! This is what I call unreadable...
You are using a propriety of die() I didn't know of...
die() can also be called with a reference argument. If this happens to be trapped within an eval(), $@ contains the reference.
So after the eval() died $@ contains a reference to an array holding only one element, which is a reference to an array containing the string "Just another Perl hacker". But what does the print() actually print?
Let's cut the all thing in several bits: first you must know that $#{@{${@}}} equals 0. Here is why: when you see $#a, this is the value of the last array index (one less than the size of the array) of the array @a. @{${@}} is an array dereference. Since $@ is an array holding only one value, the result is 0.
We now have to understand ${${${@}}[0]}[$#{${@{${@}}}[0]}]... We recognize the underlined part as an index value. Let's calculate it.
- ${${@}}[0] is the first element of the array reference by $@ (which is another reference to the array holding the string we want to print).
- In $#{${@{${@}}}[0]} the underlined part is an array (dereferenced from $@). The $#<array> notation will give us the value of the last index of the array, which is 0.
With ${${${@}}[0]}[0], we are almost there. The underlined part is an array dereference, from which we want the first element.
This element is "Just another Perl hacker". QED.
|
---|