Perl environment config with validation

Perl
use strict;
use warnings;

sub env_config {
    my (%spec) = @_;
    my %cfg;
    for my $key (sort keys %spec) {
        my $rule = $spec{$key};
        my $raw = $ENV{ $rule->{env} // $key };
        $raw = $rule->{default} if !defined $raw || $raw eq '';
        die "missing required env $key\n" if !defined $raw && $rule->{required};
        if (defined $raw && ($rule->{type} // '') eq 'int') {
            die "env $key must be an integer\n" unless $raw =~ /\A-?\d+\z/;
            $raw += 0;
        }
        $cfg{$key} = $raw if defined $raw;
    }
    return \%cfg;
}

my $cfg = env_config(port => { type => 'int', default => 8080 }, debug => { default => 0 });
print "$cfg->{port} $cfg->{debug}\n";