BEGIN { eval 'sub foo { return 2 }'; } my $i = foo 3; # my $i = 2; print("$i\n"); #### eval 'sub foo { return 2 }'; my $i = foo 3; # Syntax error! print("$i\n"); #### BEGIN { eval 'sub foo(\@) { print(@{$_[0]}, "\n"); }'; } my @a = qw( foo bar ); foo(@a); # foobar #### eval 'sub foo(\@) { print(@{$_[0]}, "\n"); }'; my @a = qw( foo bar ); foo(@a); # [undef] #### BEGIN { eval 'sub foo { print("foo\n"); }'; } BEGIN { foo(); } # foo #### eval 'sub foo { print("foo\n"); }'; BEGIN { foo(); } # Dies. Can't find foo()