0

私がIPを持っていると仮定して、私は単にのために10.23.233.34交換したいと思います。最初、2番目、最後のオクテットは不明です。3番目のオクテットはまたはです。IP、subsに一致し、最後のオクテットを切り替えながら他のすべてを保持するように置換を行いたいと思います。例えば:233234233234

入力:10.23.233.34

s/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){}233\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){}234\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/

出力:10.23.234.34

4

4 に答える 4

8

この問題は、正規表現ソリューションにはあまり適していません。代わりに、私は次のようなことをします:

$in = "10.23.233.34";
@a = split /\./, $in;
if ($a[2] == '233') {
    $a[2] = '234';
}
print join(".", @a);

上記のコードは、思いついた正規表現よりもはるかに読みやすくなっています。さらに、あなたのコードを維持しなければならない次の人は実際にそれを読むことができるでしょう。

于 2012-11-05T19:32:50.223 に答える
1

正規表現によって、物事がもろくなり、理解しにくくなることがあります。それにもかかわらず:

my $ip = '10.23.233.34';
...
for ($ip) {
    s!(?<=\.)233(?=\.\d+$)!234!;
}

詳細:整形式の点線のクワッドが与えられた場合、上記は'233'3番目のオクテットでなければならないものを探します。前にドット、後にドット、次に1つ以上の数字、次に文字列の終わりです。?<=とは?=、以外の'233'ものがキャプチャされないようにしてから、'234'置き換えられます。このアプローチでは、IPアドレスが整形式であることを検証しません。

于 2012-11-05T19:38:40.990 に答える
0
$byte = qr/(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])/;
s/($byte)\.($byte)\.(23[34])\.($byte)/join '.', $1, $2, 467-$3, $4/e;
于 2012-11-05T19:35:10.447 に答える
0

オプションは次のとおりです。

use strict;
use warnings;

my $ip = '10.23.233.34';

$ip =~ s/(\d+)(\.\d+)$/($1 == 233 ? $1+1 : $1) . $2/e;

print $ip;

出力:

10.23.234.34
于 2012-11-05T19:38:09.833 に答える