http://www.perlmonks.org?node_id=424964


in reply to RFC: Implicit Parallelization Pragma

The problem is that Perl provides no way to guarantee that a given piece of code has no side effects.
Indeed. And in Perl, this is very, very hard. How hard? Well, your own example fails the test. Even the map {length} @array may cause a side-effect.
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
Whoopsie. One of the elements of @arr changed, just by looking at it!

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.