2010-12-06 7 views
0

私は、Net :: Whois :: Rawを使ってテキストファイルからドメインのリストを照会し、これを解析して各ドメインの関連情報を出力します。Perl:パターンと文字列を一致させて次の行/行を印刷する

私が必要とする情報がパターンマッチングと同じ行にあることはないので、私がノミネットの結果をヒットするまではうまくいっていました。例えば

ネームサーバ:
ns.mistral.co.uk 195.184.229.229

だから私は何をする必要があるかについてパターンマッチである "ネームサーバ:" とし、ディスプレイ次の1行または複数の行だけを管理することはできません。

私はここですべての回答を読んだことがありますが、私の場合にはうまくいかないか、または私がシンプルなクマのように私をさらに混乱させるようです。次のように

私が使用していたコードは次のとおりです。

while ($record = <DOMAINS>) { 
    $domaininfo = whois($record); 

    if ($domaininfo=~ m/Name servers:(.*?)\n/){ 
    print "Nameserver: $1\n"; 
     } 

} 

私は

<DOMAINS>; 

は、次の行がかかりますが、これは私と私のために動作しませんでしたStackOverflowの例を試してみましたこれを$ 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

+0

もう一度、前に返信しないことをお詫びさせてください。/mは動作しました。私は何度も前にそれを使っていましたが、それは忘れてしまったのです.-) –

1

これは半分の質問ですが、おそらく半分の答えです(質問はここにありますが、まだコメントを書くことはできません...)。さて、ここで行く:

ネームサーバ:
ns.mistral.co.uk 195.184.229.229

をあなたが解析しているファイルのエントリがどのように見えるか、このですか?すぐ後に続くのは何ですか?ドメイン名とIPアドレスが増えますか?その間に空白行がありますか?

とにかく、あなたの問題は(部分的に)ファイルごとに1行ずつ読むことに関係していると思います。 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 
    } 
} 

しかし、その後、あなたは私が <DOMAINS> StackOverflowの例を試してみました

を言った;:したがって、私は、段落モードへの切り替えをお勧めします は次の行になりますが、これは私にとってはうまくいかず、$ contentinfoにすでに内容を読み込んでいるためです。

あなたは既に私が提案したことを試したことがありますか?もう1つの方法は、 'Name servers:'が読み込まれた後に1に設定する別の変数($インジケータなど)を追加することです.1に等しい限り、次のすべての行はデータを含むものとして扱われますあなたが必要です。しかし、これが実行可能かどうかは、データファイルに含まれるものが何であるかを常に知っているかどうかによって決まります。

ここに何かがあなたに役立つことを願っています。ご質問がありましたら、お尋ねください。

+0

まず最初に返信してくれないのは残念です。物事はここで少し忙しくなった。私はファイルの罪を読む良い方法のように見えるので、あなたの段落コードを覚えておきます。 –

関連する問題