The y/// is very sneaky, but why play games with that $s? If you want a 0, see if one of `$% $- $?` or `$[` work for you. Here it is shortened to **43 chars** and as an added bonus, its now strict compatible.
`# 1 2 3 4
#23456789_123456789_123456789_123456789_1234
$_=pop;y/A-Z/:-T/;$?=36*$?-48+ord for/./g;$?
`
-Blake
| [reply] [d/l] [select] |

| [reply] |

Since you're well past my meagre 59 (from the use.perl thread), I might as well show it:
$_=shift;y/0-9A-Z/\0-#/;(s/.//,($a*=36)+=ord)while length
Yes, no output-- the game rules were unclear that way, too.
Using your tricks I can get down to -- 43.
$_=pop;y/0-9A-Z/\0-#/;($a*=46)+=ord for/./g
If only the null byte were legal in y///, then the above could become 42...
-- jhi
| [reply] |

Assuming that 46 is a typo...
`($a*=36)+=ord # 13 chars
$a=$a*36+ord # 12 chars
`
But as you say, the rules are rather murky, so its tough to judge what qualifies as a solution and what doesn't.
-Blake
| [reply] [d/l] |

Could someone brief me on the y/// syntax? I took a look in man perlre, and tried stepping through it in the debugger - both were futile.
-jackdied | [reply] |

y is a function which is explained in perlop. What it
does is substitutes for any character in one list, the
corresponding charater on another list.
What I did was use ord and chr to figure out what the
ASCII representation of 9 was, and what came right after
that. Then I used tr to move the range A-Z so that they
came right after the range 0-9, so that I could convert any
digit into a number just by taking ord and subtracting
off the ord of 0.
| [reply] |