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.
Here's another example:
use warnings;
use strict;
{
package Tmp;
use overload '""' => \&str, fallback => 1;
sub c {
bless [$_[1]], $_[0]
}
sub str {
print "Hello, $_[0][0]\n";
"." x rand 10
}
}
my @strs = map Tmp->c($_), qw[foo bar baz];
my @str_lengths = map { length } @strs;
print "$_\n" for @str_lengths;
As you can see, this time each call to
length prints something to
STDOUT and calls
rand, which modifies global state.
This is another reason why perl can't optimize such a loop in the general case:
it's very hard to prove that
@strs isn't tied or contains objects
with overloaded stringification.