Perl:模式匹配一​​个字符串,然后打印下一行/行

时间:2010-12-06 16:01:39

标签: perl pattern-matching design-patterns

我使用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。

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

2 个答案:

答案 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,所有后面的行将被视为包含数据你需要。但是,这是否可行取决于您始终知道您的数据文件包含的其他内容。

我希望这里的某些内容对你有所帮助。如果有任何问题,请询问:)