note
Anonymous Monk
<blockquote>
The problem is that Perl provides no way to guarantee that a given piece of code has no side effects.
</blockquote>
Indeed. And in Perl, this is very, very hard. How hard? Well, your own example <em>fails the test</em>. Even the <code>map {length} @array</code> may cause a side-effect.
<code>
use Devel::Peek;
my @arr = ("foo", 3);
Dump($arr[-1]);
my @bogus = map {length} @arr;
Dump($arr[-1]);
__END__
SV = IV(0x8192bcc) at 0x8184234
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 3
SV = PVIV(0x8184888) at 0x8184234
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 3
PV = 0x8189cf8 "3"\0
CUR = 1
LEN = 2
</code>
Whoopsie. One of the elements of <code>@arr</code> changed, just by looking at it!
<p>
This is the same reason why threads in Perl take quite a lot of overhead, and that by default variables are copied (and not shared) between threads.
424933
424933
30