2010-12-06 1 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"; 
     } 

} 

Я попытался пример Stackoverflow где

<DOMAINS>; 

будет принимать следующую строку, но это не работает для меня, и я предположим, это потому, что мы уже прочитали его содержимое в домене $ domaininfo.

EDIT: Забыл сказать спасибо! как грубо.

ответ

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-адрес, который находится на следующей строке.

Возможно, это немного портит, чтобы заставить его работать в вашей ситуации.

+0

Вы можете совпадение на '\ n' без'/m'; флаг '/ m' * * влияет только на' '' '' '' '' '' ''. – ysth

+0

Опять же позвольте мне извиниться за то, что вы не ответили ранее. Работа/м. Я использовал его много раз до этого, но забыл об этом, что довольно скупо из меня ;-) –

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

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

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

+0

Во-первых, позвольте мне сказать, извините, что не ответил ранее. Вещи здесь немного заняты. Я буду держать в виду ваш код абзаца, поскольку он выглядит как хороший способ чтения файла sin. –