(my $var1 = < EOT (my $var2 = < EOT #### # Was building $var3 in scalar instead of list context # my $var3 = map { s/\r?\n\Z/(munched)/; $_ } < EOT #### my $var4; # This generates "Modification of a read-only value attempted at"; eval { # Still dies, even when in list context. # $var4 = map { s/\r?\n\Z/(munched)/; $_ } <## # map{}' on the last key is ok. my $href = { key1 => { subkey1 => "Defined first is OK", subkey2 => map{s/\r?\n\Z/(munched)/;$_} (${^__}=< EOT }, }; # This explodes... # map{}' ing, then defining another key leads to a runtime error. eval { $href->{key2} = { subkey1 => map{s/\r?\n\Z/(munched)/;$_} ($ {^__}=< EOT subkey2 => "Kaboom !", }; }; if ($@) { ($href->{key2}->{subkey1} = $@) =~ s/\r?\n\Z//; $href->{key2}->{subkey2} = "Set after eval"; $@ = undef; } #### # This doesn't die, but gives the count of matches... $href->{key3} = { subkey1 => "Hello", subkey2 => ($ {^__} =< EOT subkey3 => "No explosion here...but the count of matches", }; #### $href->{key4} = { subkey1 => "Hello", subkey2 => eval { ($ {^__} =< EOT return $ {^__}; }, subkey3 => "No explosion here...", }; #### use strict; use warnings; my $interpolated = "I was interpolated"; # This strips _every_ newline (my $var1 = < EOT #This only strips the "ending" newline (my $var2 = < EOT # This will return the number of substitutions # Fixed. Was building $var3 in scalar instead of list context. #my $var3 = map { s/\r?\n\Z/(munched)/; $_ } < EOT my $var4; # This generates "Modification of a read-only value attempted at"; eval { # Still dies, even if called in list context. # $var4 = map { s/\r?\n\Z/(munched)/; $_ } < { subkey1 => "Defined first is OK", subkey2 => map{s/\r?\n\Z/(munched)/;$_} (${^__}=< EOT }, }; # This explodes... # map{}' ing, then defining another key leads to a runtime error. eval { $href->{key2} = { subkey1 => map{s/\r?\n\Z/(munched)/;$_} ($ {^__}=< EOT subkey2 => "Kaboom !", }; }; if ($@) { ($href->{key2}->{subkey1} = $@) =~ s/\r?\n\Z//; $href->{key2}->{subkey2} = "Set after eval"; $@ = undef; } # This doesn't die, but gives the count of matches... $href->{key3} = { subkey1 => "Hello", subkey2 => ($ {^__} =< EOT subkey3 => "No explosion here...but the count of matches above", }; $href->{key4} = { subkey1 => "Hello", subkey2 => eval { ($ {^__} =< EOT return $ {^__}; }, subkey3 => "No explosion here...", }; print map {s/\r?\n\Z//; $_} < ------ var2 : <$var2> ------ var3 : <$var3> ------ var4 : <$var4> ------ From the hash refs: key1->subkey1 <$href->{key1}->{subkey1}> key1->subkey2 <$href->{key1}->{subkey2}> ------ key2->subkey1 <$href->{key2}->{subkey1}> key2->subkey2 <$href->{key2}->{subkey2}> ------ key3->subkey1 <$href->{key3}->{subkey1}> key3->subkey2 <$href->{key3}->{subkey2}> key3->subkey3 <$href->{key3}->{subkey3}> ----- key4->subkey1 <$href->{key4}->{subkey1}> key4->subkey2 <$href->{key4}->{subkey2}> key4->subkey3 <$href->{key4}->{subkey3}> EOF