我使用Net :: Whois :: Raw从文本文件中查询域列表,然后解析它以输出每个域的相关信息。
在我点击Nominet结果之前一切顺利,因为我需要的信息永远不会与模式匹配相同。
例如:
名称服务器:
ns.mistral.co.uk 195.184.229.229
所以我需要做的是“名称服务器:”的模式匹配,然后显示下一行或多行,但我无法管理它。
我已经阅读了这里的所有答案,但它们要么在我的案例中不起作用,要么让我更加困惑,因为我是一只简单的熊。
我使用的代码如下:
while ($record = <DOMAINS>) {
$domaininfo = whois($record);
if ($domaininfo=~ m/Name servers:(.*?)\n/){
print "Nameserver: $1\n";
}
}
我尝试过Stackoverflow的一个例子
<DOMAINS>;
将采用下一行,但这对我不起作用,我认为这是因为我们已经将这些内容读入$ domaininfo。
编辑:忘了说谢谢! 多么粗鲁。
答案 0 :(得分:2)
那么,$ domaininfo字符串包含你的域名?
您可能需要的是正则表达式末尾的m
参数。这会将您的字符串视为多行字符串(就是这样)。然后,您可以匹配\n
字符。这对我有用:
my $domaininfo =<<DATA;
Name servers:
ns.mistral.co.uk 195.184.229.229
DATA
$domaininfo =~ m/Name servers:\n(\S+)\s+(\S+)/m;
print "Server name = $1\n";
print "IP Address = $2\n";
现在,我可以匹配\n
行末尾的Name servers:
,并捕获下一行的名称和IP地址。
可能需要进行一些调整以使其适用于您的情况。
答案 1 :(得分:1)
这是半个问题,也许是半个答案(这里的问题因为我还没有被允许写评论......)。好的,我们走了:
名称服务器:
ns.mistral.co.uk 195.184.229.229
这是您正在解析的文件中的条目是什么样的?之后会立即采取什么措施 - 更多域名和IP地址?中间会有空白吗?
无论如何,我认为您的问题可能(部分?)与您逐行阅读文件有关。到达IP地址行后,有关“名称服务器:”的信息将消失。如果您逐行查看文件,多行匹配将无济于事。因此我建议切换到段落模式:
{
local $/ = ''; # one paragraph instead of one line constitutes a record
while ($record = <DOMAINS>) {
# $record will now contain all consecutive lines that were NOT separated
# by blank lines; once there are >= 1 blank lines $record will have a
# new value
# do stuff, e.g. pattern matching
}
}
但是你说了
我试过一个Stackoverflow的例子 &LT;结构域取代; 将采取下一行,但这对我不起作用,我认为这是因为我们已经将这些内容读入$ domaininfo。
所以也许你已经尝试过我刚刚建议的内容了?另一种方法是添加另一个变量($ indicator或者其他),一旦'Name servers:'被读取,你将设置为1,只要它等于1,所有后面的行将被视为包含数据你需要。但是,这是否可行取决于您始终知道您的数据文件包含的其他内容。
我希望这里的某些内容对你有所帮助。如果有任何问题,请询问:)