【问题标题】:PERL Net::DNS output to filePERL Net::DNS 输出到文件
【发布时间】:2016-01-20 13:48:52
【问题描述】:

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

【问题讨论】:

  • 说你有“垃圾”并不是特别有用,至少没有一个垃圾看起来像什么的小例子

标签: perl dns


【解决方案1】:

您的@zone 数组包含Net::DNS::RR 对象的列表,其print 方法将该对象字符串化并将其打印到当前选定的文件句柄

要将相同的内容打印到不同的文件句柄,您必须自己对对象进行字符串化

这应该可行

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

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

【讨论】:

  • 谢谢....此文件输出与屏幕输出相同。在 Perl 上要学很多东西。
【解决方案2】:

当您学习一门新语言时,对代码进行随机更改以希望它们能满足您的需求并不是一个好主意。更好的方法是阅读您正在使用的库和函数的文档。

原代码使用$rr->printNet::DNS::Resolver 的文档说:

打印

$resolver->print;

在标准输出上打印解析器状态。

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

字符串

print $resolver->string;

返回解析器状态的字符串表示形式。

所以看起来$rr->print 等同于print $rr->string。更改它以打印到您的新文件句柄非常简单。

print $fh $rr->string;

附言顺便说一下,它是“Perl”,而不是“PERL”。

【讨论】:

  • print 方法正好是 print shift->string, "\n",因此它不是像文档中所说的打印到 STDOUT,而是实际打印到当前选择的文件句柄
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2016-10-29
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2015-11-21
  • 1970-01-01
相关资源
最近更新 更多