0

Perl でデータを配列に変換するにはどうすればよいですか?

ここに私のデータがあります:

my $data =
  "203.174.38.128203.174.38.129203.174.38.1" .
  "30203.174.38.131203.174.38.132203.174.38" .
  ".133203.174.38.134173.174.38.135203.174." .
  "38.136203.174.38.137203.174.38.142";

そして、私はそれをこのような配列に変換したい

my @array= (
  "203.174.38.128",
  "203.174.38.129",
  "203.174.38.130",
  "203.174.38.131",
  "203.174.38.132",
  "203.174.38.133",
  "203.174.38.134",
  "173.174.38.135",
  "203.174.38.136",
  "203.174.38.137",
  "203.174.38.142"
);

Perlでそれを行う方法を知っている人はいますか?

4

3 に答える 3

1

ログに記録されるIPの最初の部分が常にである場合203、それはちょっと簡単です:

my @arr = split /(?<=\d)(?=203\.)/, $data;

与えられた例ではそうではありませんが、最初の部分は常に3桁で、2番目の部分は常に174であるため、これで十分です...

my @arr = split /(?<=\d)(?=\d{3}\.174\.)/, $data;

...正しい結果を得るには。

ただし、これらの「マーカー」部分が動的すぎる場合、ここでより一般的な(そして防弾の)ソリューションを提供することはほぼ不可能であることを理解してください。たとえば、この文字列を取ります...

11.11.11.22222.11.11.11

問題は、それをどこで分割するかということです。それはすべき11.11.11.22; 222.11.11.11ですか?または11.11.11.222; 22.11.11.11?私に言わせれば、どちらも非常に有効なIPです。また、「2222」の部分を分割しようとすると、さらに悪化する可能性があります(「2; 222」、「22; 22」、さらには「222; 2」の場合もあります)。

たとえば、次のルールを作成できます。「3桁を超える各シーケンスを分割し、その後にドット記号を付けて、この分割の2番目の部分が常に3桁から始まるようにします」:

my @arr = split /(?<=\d)(?=\d{3}\.)/, $data;

...ただし、データ文字列に最初のオクテットが2桁または1桁のIPがある場合、前述のあいまいなケースでは明らかに正しく機能しません。

于 2012-11-03T17:06:42.217 に答える
1

カルテット内の数値のいずれかの有効な値に一致する正規表現を作成すると、それらすべてを検索して 4 つのセットに再結合できます。これ

/2[0-5][0-5]|1\d\d|[1-9]\d|\d/

は 200-255 または 100-199 または 10-99 または 0-9 に一致し、それを使用するプログラムを以下に示します。

文字列を分割する方法が複数ある場合、どのオプションを使用するかを知る方法はありません。この解決策では、2 つの IP アドレスの最初のアドレスに最も長い値が割り当てられます。たとえば、と の1.1.1.1234.1.1.1ように分割され1.1.1.123ます。4.1.1.1

use strict;
use warnings;

use feature 'say';

my $data =
  "203.174.38.128203.174.38.129203.174.38.1" .
  "30203.174.38.131203.174.38.132203.174.38" .
  ".133203.174.38.134173.174.38.135203.174." .
  "38.136203.174.38.137203.174.38.142";

my $byte = qr/2[0-5][0-5]|1\d\d|\d\d|\d/;

my @bytes = $data =~ /($byte)/g;
my @addresses;
push @addresses, join('.', splice(@bytes, 0, 4)) while @bytes;

say for @addresses;

出力

203.174.38.128
203.174.38.129
203.174.38.130
203.174.38.131
203.174.38.132
203.174.38.133
203.174.38.134
173.174.38.135
203.174.38.136
203.174.38.137
203.174.38.142
于 2012-11-03T23:37:31.647 に答える
0

サンプルを使用すると、最初と最後のノードに 3 桁あるように見えます。これは、次のパターンを使用してプロンプトを表示します。

/(\d{3}\.\d{1,3}\.\d{1,3}\.\d{3})/

それをスイッチで追加すると、/gすべてがプルされます。

ただし、サンプルで示したものよりも大きくて異なるデータ セットがある場合は、この文字列にそれらをダンプする前に、誰かが IP を分離する必要があります。それらが別々のデータ ポイントである場合は、ある程度の分離が必要です。

于 2012-11-03T18:29:38.063 に答える