#### test1-do.pl $var++; print " Point A: " . __PACKAGE__ . " $var\n"; #### test.pl #!/usr/bin/perl -w $main::var = $B::var = 5; print "Point 1: " . __PACKAGE__ . " $main::var $B::var\n"; package B; $rv = do "test1-do.pl"; die $@ if $@; die $! unless defined $rv; print "Point 2: " . __PACKAGE__ . " $main::var $B::var\n"; __END__ As I understand it the code in the do should be evaluated in the same package it was called from. This does happen for the assignment ($var++), but it doesn't seem to get the right __PACKAGE__ #### Actual output Point 1: main 5 5 Point A: main 6 Point 2: B 5 6 ^^ $B::var has actually been changed #### Expected: Point 1: main 5 5 Point A: B 6 Point 2: B 5 6