2010-12-06 93 views
0

我使用Net :: Whois :: Raw从文本文件中查询域列表,然后通过解析来输出每个域的相关信息。Perl:模式匹配一​​个字符串,然后打印下一行/行

这一切都很顺利,直到我点击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"; 
     } 

} 

我已经尝试#1的例子,其中

<DOMAINS>; 

将采取下一行,但这个并没有为我和我的工作假设这是因为我们已经将这个内容读入$ domaininfo。

编辑:忘了说谢谢! 多粗鲁。

回答

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

现在,我可以在Name servers:行的末尾匹配\n并捕获这是对下一行的名称和IP地址。

这可能需要消耗一点时间以使其适用于您的情况。

+0

你可以在没有`/ m`的`\ n`上匹配; `/ m`标志*只影响'^`和`$`匹配的内容。 – ysth 2010-12-06 17:05:03

+0

再一次,让我为之前没有回复而道歉。/m工作。我以前曾经使用过很多次,但是忘记了这一点,我对此非常感兴趣;-) – 2010-12-14 15:34:23

1

这是半个问题,也许是半个答案(问题在这里,因为我还没有被允许写评论......)。好了,我们开始吧:

名称服务器:
ns.mistral.co.uk 195.184.229.229

难道这就是你解析看起来像在文件中的记录?之后会立即采取什么措施 - 更多域名和IP地址?中间会有空行吗?

无论如何,我认为你的问题可能(部分?)与你逐行阅读文件有关。一旦你到达IP地址行,关于'Name servers:'的信息就会消失。如果您逐行查看文件,多行匹配将无济于事。因此,我建议切换到段落模式:

{ 
    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 
    } 
} 

但你说

我已经尝试#1的例子,其中 <畴>; 将采取下一行,但这并没有为我工作,我认为这是因为我们已经读到$ domaininfo的内容。

因此,也许你已经尝试了我刚刚建议的?另一种方法是添加另一个变量($ indicator或其他),一旦读取了“Name servers:”,您将设置为1,只要它等于1,所有后续行将被视为包含数据你需要。然而,这是否可行取决于你总是知道你的数据文件包含了什么。

我希望这里的东西对你有帮助。如果有任何问题,请询问:)

相关问题