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".