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

Perl:模式匹配字符串,然后打印下一行,perl,pattern-matching,design-patterns,Perl,Pattern Matching,Design Patterns,我使用Net::Whois::Raw从文本文件中查询域列表,然后通过该列表进行解析以输出每个域的相关信息 在我点击Nominet结果之前一切都进行得很顺利,因为我所需要的信息与我正在进行的模式匹配从来都不在同一条线上 例如: 名称服务器: ns.mistral.co.uk 195.184.229.229 所以我需要做的是对“名称服务器”进行模式匹配,然后显示下一行或几行,但我就是无法管理它 我已经通读了这里的所有答案,但它们要么在我的情况下似乎不起作用,要么让我更加困惑,因为我是一只简单的熊 我

我使用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";
      }

}
while($record=){
$domaininfo=whois($record);
if($domaininfo=~m/名称服务器:(.*)\n/){
打印“名称服务器:$1\n”;
}
}
我试过Stackoverflow的一个例子,其中

<DOMAINS>;
下一行,但这对我来说不起作用,我认为这是因为我们已经将其内容读入$domaininfo

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

那么,$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";

my$domaininfo=那么,$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";

my$domaininfo=这是半个问题,也许是半个答案(问题在这里,因为我还不允许写评论…)。好了,我们开始:

名称服务器:
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
   }
}
{
本地$/=“”;#一段而非一行构成记录
而($record=){
#$record现在将包含所有未分隔的连续行
#按空行;一旦有>=1个空行,$记录将有一个
#新价值
#做一些事情,例如模式匹配
}
}
但后来你说

我试过Stackoverflow的一个例子,其中 ; 下一行,但这对我来说不起作用,我认为这是因为我们已经将其内容读入$domaininfo。 也许你已经试过我刚才的建议了?另一种方法是只添加另一个变量($indicator或其他任何变量),在读取“Name servers:”后将其设置为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
   }
}
{
本地$/=“”;#一段而非一行构成记录
而($record=){
#$record现在将包含所有未分隔的连续行
#按空行;一旦有>=1个空行,$记录将有一个
#新价值
#做一些事情,例如模式匹配
}
}
但后来你说

我试过Stackoverflow的一个例子,其中 ; 下一行,但这对我来说不起作用,我认为这是因为我们已经将其内容读入$domaininfo。 也许你已经试过我刚才的建议了?另一种方法是只添加另一个变量($indicator或其他任何变量),在读取“Name servers:”后将其设置为1,只要它等于1,以下所有行都将被视为包含所需的数据。然而,这是否可行取决于您始终知道数据文件还包含哪些内容


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

您可以在
\n
上进行匹配,而无需
/m
/m
标志只影响与
^
$
匹配的内容。再次为没有提前回复而道歉。机器运转正常。我以前用过很多次,但都忘了,这让我很笨;-)您可以在
\n
上进行匹配,而无需
/m
/m
标志只影响与
^
$
匹配的内容。再次为没有提前回复而道歉。机器运转正常。我以前用过很多次,但都忘了,这让我很笨;-)先让