Perl JSON decode with positioned errors

Perl
use strict;
use warnings;
use JSON::PP ();

sub parse_json {
    my ($text) = @_;
    die "empty input\n" unless defined $text && length $text;
    my $data = eval { JSON::PP->new->utf8->allow_nonref->decode($text) };
    return $data unless $@;
    my $err = $@;
    my ($offset) = $err =~ /at character offset (\d+)/;
    $err =~ s/\s+at \S+ line \d+.*//s;
    die defined $offset ? "JSON error at byte $offset: $err\n" : "JSON error: $err\n";
}

for my $doc ('{"a":1}', '{"a":') {
    my $ok = eval { parse_json($doc) };
    print $ok ? "parsed\n" : $@;
}