use warnings; use strict; my %global; try($_) for 0,0,0,1,0; sub try { my $xyz = shift; if($xyz) { $global{globalvar} = undef; } printf "try(%d) => globalvar %s\n", $xyz, exists $global{globalvar} ? "exists" : "doesn't exist"; } __END__ try(0) => globalvar doesn't exist try(0) => globalvar doesn't exist try(0) => globalvar doesn't exist try(1) => globalvar exists try(0) => globalvar exists #### use warnings; use strict; my $xyz = 0; if($xyz) { eval { $main::globalvar = undef; print STDERR __LINE__, ": eval'd\n"} } printf "%d: if(%d) => didn't eval\n", __LINE__, $xyz; $xyz = 1; if($xyz) { eval { $main::globalvar = undef; print STDERR __LINE__, ": eval'd\n"} } printf "%d: if(%d) => did eval => '%s'\n", __LINE__, $xyz, defined $main::globalvar ? $main::globalvar : '';