Your variable is undefined because there wasn't an answer to the specific question you asked
From the Net::DNS::Resolver documentation:
Returns a "Net::DNS::Packet" object, or "undef" if no answers were found. If you need to examine the response packet whether it contains any answers or not, use the send() method instead.
This amended code uses send() instead:
use strict;
use warnings;
use Net::DNS;
my $domain = $ARGV[0];
#192.48.79.30 is j.gtld-servers.net
my $res = Net::DNS::Resolver->new(
nameservers => [qw(192.48.79.30)],
recurse => 1,
debug => 1,
);
my $packet = $res->send("$domain", 'NS');
my @authority = $packet->authority;
foreach my $rr (@authority) {
print $rr->string, "\n";
}