The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict; use warnings;
use PadWalker 'peek_sub';

print "1..4\n";

my $t = 0;

sub onlyvars {
  my (@initial);
  my ($t, $h, @names) = @_;
  my %names;
  @names{@names} = (1) x @names;
  
  while (my ($n,$v) = each %$h) {
    if (!exists $names{$n}) {
      print "not ok $t\t# Unexpected interloper $n\n";
      return;
    }
    delete $names{$n};
  }
  if (keys %names) {
    print "not ok $t\t# Not found: ", join(', ', keys %names), "\n";
    return;
  }
  print "ok $t\n";
}

onlyvars(++$t, peek_sub(\&onlyvars), qw(@initial $t $h @names %names $n $v));

sub f {
  my $x = shift;
  sub {
    my $y = $x;
  }
}

onlyvars(++$t, peek_sub(f()), qw($x $y));

sub g {
  my $x = shift;
  sub {
    my $y;
  }
}

onlyvars(++$t, peek_sub(g()), qw($y));

my $x = "Hello!";
my $h = peek_sub(sub {my $y = $x});
print (($h->{'$x'} == \$x) ? "ok 4\n" : "not ok 4\n");