Perl: шаблон соответствует строке и затем печатает следующую строку / строки - PullRequest
0 голосов
/ 06 декабря 2010

Я использую 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 ]

2 голосов
/ 06 декабря 2010

Итак, строка $ 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 голос
/ 07 декабря 2010

Это половина вопроса и, возможно, половина ответа (вопрос здесь, так как мне еще не разрешено писать комментарии ...). Ладно, поехали:

Серверы имен:
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, где ; займем следующую строку, но это не сработало для меня, и я предполагаю, что это потому, что мы уже прочитали содержимое этого в $ domaininfo.

так, может быть, вы уже попробовали то, что я только что предложил? В качестве альтернативы можно было бы просто добавить другую переменную ($ индикатор или что-то еще), которую вы установите в 1 после прочтения «Серверы имен:», и до тех пор, пока она равна 1, все последующие строки будут обрабатываться как содержащие данные тебе нужно. Однако возможно ли это, зависит от того, знаете ли вы, что еще содержится в вашем файле данных.

Я надеюсь, что что-то здесь было полезно для вас. Если есть какие-либо вопросы, пожалуйста, задавайте:)

...