将 PERL Net::DNS 的输出保存到文件中。

4

我完全不懂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.

3
“说你有‘垃圾’并没有什么特别的帮助,至少需要一个小例子来展示那些垃圾是什么样子。” - Alnitak
2个回答

4
你的@zone数组包含了一个Net::DNS::RR对象列表,它的print方法将对象转换成字符串并输出到当前选择的文件句柄中。
如果想要将相同的内容输出到不同的文件句柄上,那么你需要手动将对象转换成字符串。
以下代码可以实现这个功能。
open my $fh, '>', $filename or die "Could not open file '$filename': $!";

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

谢谢......将这个输出写入文件的结果与在屏幕上的输出一样。还有很多关于 Perl 的东西需要学习。 - DaveS

3
当你学习一门新语言时,随意更改代码以期望达到想要的效果并不是一个好主意。更好的方法是阅读你正在使用的库和函数的文档。
原始代码使用了$rr->print。关于Net::DNS::Resolver的文档中写道:

print

$resolver->print;

Prints the resolver state on the standard output.

print() 方法是以标准 Perl print 函数命名的,我们可以使用它将数据打印到任何文件句柄中。有一个名为 string 的 Net::DNS::Resolver 方法,其文档描述如下:

string

print $resolver->string;

Returns a string representation of the resolver state.

看起来$rr->print等同于print $rr->string。而且很容易将其更改为打印到您的新文件句柄。

print $fh $rr->string;

p.s. 顺便说一句,它是“Perl”,而不是“PERL”。


1
print 方法实际上是 print shift->string, "\n",因此它并不像文档所说的那样打印到 STDOUT,而是打印到当前选择的文件句柄。 - Borodin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接