使用regexp将变量的部分分配给Perl中的另一个变量

时间:2016-06-15 17:35:22

标签: regex perl

如果我有

my $ip = "10.9.8.X";

我希望$ IPCore有“10.9.8”。有一种简单的方法可以在一行中完成这项工作吗?

我通常这样做

my $ip = "10.9.8.X";
my $IPCore = $ip;
$IPCore =~ s/([0-9]{3}\.[0-9]{3}\.[0-9]{3})\.[xX]{1,3}$/$1/

##$IPCore is now 10.9.8

有更简单的方法吗?

谢谢

3 个答案:

答案 0 :(得分:2)

删除最后.及其后的所有内容的简短解决方案:

( my $IPCore = $ip ) =~ s/\.[^.]*\z//;
my $IPCore = $ip =~ s/\.[^.]*\z//r;                        # 5.14+

优化解决方案,删除第三个.及其后的所有内容:

( my $IPCore = $ip ) =~ s/^[^.]*+(?:\.[^.]*+){2}\K.*//s;   # 5.10+
my $IPCore = $ip =~ s/^[^.]*+(?:\.[^.]*+){2}\K.*//sr;      # 5.14+

答案 1 :(得分:0)

假设您相信IP将以合理的格式出现,一个非常简单的方法就是从上一个.(点)切断最后一个段,如下所示:

 my $ip = '10.9.8.x';
 (my $ipCore = $ip) =~ s/(.*?)\.[^.]+$/$1/;
 print $ipCore;
//yields '10.9.8'

答案 2 :(得分:0)

3只鸟,1只石头

my ($ip, $IPCore) = ("10.9.8.X");
print $IPCore if $ip =~ /([0-9]{1,3}(?:\.[0-9]{1,3}){2})\.[xX]{1,3}$(?{$IPCore=$^N})/;

10.9.8