in reply to Passing pointers around

Change fubar() to this:
sub fubar { ${$_[0]} = 4; print "${$_[0]}\n"; }

Unfortunately for you, this is one of those cases where Perl's Do-What-I-Mean nature happens to do what someone else meant. In effect, what you did was set ${$_}[0] = 4; which, since $_ isn't declared but is special winds up creating an anonymous array in $_ which has a single item in it, 4. All that without complaining since $_ has so much magic surrounding it. =)

The problem there is that perl binds "$" stronger than "[]" so it deref's $_ rather than deref'ing @_'s first item. HTH, BTW this sort of question really belongs in Seekers of Perl Wisdom...