PERL Net::DNS вывод в файл

Совершенно новый для Perl (в процессе обучения) и нужна помощь. Вот какой-то код, который я нашел, который отлично печатает результаты на экране, но я хочу, чтобы он печатался в файл. Как я могу это сделать? Когда я открываю файл и отправляю в него вывод, я получаю данные мусора.

Вот код:

use Net::DNS;
my $res  = Net::DNS::Resolver->new;
$res->nameservers("ns.example.com");

my @zone = $res->axfr("example.com");

foreach $rr (@zone) {
$rr->print;
}

Когда я добавляю:

open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
.....
$rr -> $fh; #I get garbage.

2 ответа

Решение

Ваш @zone массив содержит список Net::DNS::RR объекты, чьи print Метод переводит объект в строку и выводит его на текущий выбранный дескриптор файла.

Чтобы напечатать одно и то же в другом дескрипторе файла, вам нужно будет самому разметить объект

Это должно работать

open my $fh, '>', $filename or die "Could not open file '$filename': $!";

print $fh $_->string, "\n" for @zone;

Когда вы изучаете новый язык, вносить случайные изменения в код в надежде, что они сделают то, что вы хотите, не очень хорошая идея. Гораздо лучший подход - прочитать документацию по библиотекам и функциям, которые вы используете.

Оригинальный код использует $rr->print, Документация для Net:: DNS:: Resolver гласит:

Распечатать

$resolver->print;

Печатает состояние распознавателя на стандартном выводе.

print() метод там назван в честь стандартного Perl printфункция, которую мы можем использовать для печати данных в любой файловый дескриптор. Есть метод Net:: DNS:: Resolver, который называется string который задокументирован так:

строка

print $resolver->string;

Возвращает строковое представление состояния резолвера.

Так выглядит $rr->print эквивалентно print $rr->string, И это достаточно просто изменить, чтобы напечатать на ваш новый дескриптор файла.

print $fh $rr->string;

ps И, кстати, это "Perl", а не "PERL".

Другие вопросы по тегам