use strict; use warnings; our $var = 10; our $keep = 20; print "\$var = $var\n"; print "\$keep = $keep\n"; print "Reset <<\$$_>>\n" for dangerous_reset(qr/^v/); print "\$var = $var\n"; print "\$keep = $keep\n"; sub dangerous_reset { my $criteria = shift; my $package = (caller)[0] . '::'; { no strict 'refs'; my @wanted = grep { /$criteria/ # Meets criteria && defined *{$package . $_}{SCALAR} # Has scalar element && /^[\p{alpha}_]\w*$/ # Isn't special. } keys %{$package}; undef ${*{$package . $_}{SCALAR}} for @wanted; return @wanted; # Return count, or list of variables removed. } }