I got slightly different results but I also changed the foreach a bit...
#!/usr/bin/perl
print "foreach...\n";
foreach (my $object = Foo->new) {}
print "after foreach\n";
print "while...\n";
while (my $object = Foo->new && 0) {}
print "after while\n";
print "for...\n";
for (my $object = Foo->new; 1 < 0; ) {}
print "after for\n";
package Foo;
sub new { my $self = bless {},shift; print "CREATED $self\n"; $self }
sub DESTROY { print "DESTROYED $_[0]\n" }
__END__
foreach...
CREATED Foo=HASH(0x813361c)
after foreach
while...
CREATED Foo=HASH(0x8133700)
DESTROYED Foo=HASH(0x8133700)
after while
for...
CREATED Foo=HASH(0x813cfcc)
after for
DESTROYED Foo=HASH(0x813cfcc)
DESTROYED Foo=HASH(0x813361c)