如何在Perl中匹配IP地址?

如何在Perl中匹配IP地址?,perl,ip-address,Perl,Ip Address,我有一个本地DNS脚本,我从一个以前的员工那里继承下来,需要比较一些值,看看它们是否匹配特定的MX记录和IP地址 我的MX部件已经放下了,好的: 120 $doug = doug.local 139 if ($mx_record =~ /$doug/) { 140 print ("Mail on doug.\n"); 141 } 142 else { 143 print ("Not on doug.\n"); 144 } $mx_

我有一个本地DNS脚本,我从一个以前的员工那里继承下来,需要比较一些值,看看它们是否匹配特定的MX记录和IP地址

我的MX部件已经放下了,好的:

120 $doug = doug.local
139 if ($mx_record =~ /$doug/) {
140         print ("Mail on doug.\n");
141 }
142         else {
143                 print ("Not on doug.\n");
144 }
$mx_record
是mx查询中的一行,如下所示:

thomas.            302     IN      MX      10 doug.local.
现在我需要看看A记录是否匹配

查询中的
$a_record
变量如下所示

thomas.            300     IN      A       10.0.0.47
如何执行条件语句来匹配IP地址


我需要在变量中定义IP,然后查看
$a_record
变量是否包含已定义的IP。

这将匹配看起来像IP地址的条目,但也将匹配999.999.999.999。请确保在使用匹配的地址之前对其进行验证

if ($mx_record =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) {...}

这将匹配看起来像ip地址的条目,但也将匹配999.999.999.999。请确保在使用匹配的地址之前对其进行验证

if ($mx_record =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) {...}
试试这个:

if ($mx_record =~ /A\w+(<record_ip>(?:/[0-9]{1,3}.){4})/ {
   print $record_ip
}
if($mx_-record=~/A\w+((?:/[0-9]{1,3}。){4})/{
打印$record\u ip
}
这将检查后面是否有空格,后面是否有虚线四元组。四元组保存在变量$record_ip中。请尝试以下操作:

if ($mx_record =~ /A\w+(<record_ip>(?:/[0-9]{1,3}.){4})/ {
   print $record_ip
}
if($mx_-record=~/A\w+((?:/[0-9]{1,3}。){4})/{
打印$record\u ip
}

这将检查后面是否有空格,后面是否有虚线四元组。四元组保存在变量$record_ip中我相信有更好的方法,但这将使您非常接近:

if($a_record =~ /((?:\d{1,3}\.){3}\d{1,3})/) {
     warn "IP was: $1";
}

# IP was: 10.0.0.47

这与
10.0.0.
匹配,然后是最终的
47

我相信有更好的方法,但这会让您非常接近:

if($a_record =~ /((?:\d{1,3}\.){3}\d{1,3})/) {
     warn "IP was: $1";
}

# IP was: 10.0.0.47
my $a_record = 'thomas.            300     IN      A       10.0.0.47';
my $ip = '10.0.0.47';

if ($a_record =~ /\b(\Q$ip\E)$/) {
    print "Matches: $1\n";
}

这与
10.0.0.
匹配,然后是最后的
47

由于IP地址可能不是最紧凑的十进制表示法,我建议您使用
Socket
模块中的
inet\u aton()
函数:

my $a_record = 'thomas.            300     IN      A       10.0.0.47';
my $ip = '10.0.0.47';

if ($a_record =~ /\b(\Q$ip\E)$/) {
    print "Matches: $1\n";
}
use Socket;

my $ip_to_match = inet_aton('10.0.0.47');
...
if (inet_aton($field) == $ip_to_match) {
    ...
}

注意:假设DNS记录已被拆分为其组成部分

,因为IP地址可能不是最紧凑的十进制表示法,我建议您使用
Socket
模块中的
inet\u aton()
函数:

use Socket;

my $ip_to_match = inet_aton('10.0.0.47');
...
if (inet_aton($field) == $ip_to_match) {
    ...
}

注意:假设DNS记录已拆分为其组件部分

如果您只想匹配IPv4正则表达式,请使用

与其在整个生产线上运行正则表达式,不如更安全地标记它们并根据需要匹配各个部分

use strict;
use warnings;

use Data::Dumper;

sub parse_record {
    my $line = shift;

    # special rules for parsing different types
    my %More4Type = (
        MX      => sub { return( priority => $_[0], provider => $_[1] ) },
        default => sub { return( provider => $_[0] ) }
    );

    my(%record, @more);
    (@record{qw(host uhh class type)}, @more) = split /\s+/, $line;
    my $more_func = $More4Type{$record{type}} || $More4Type{default};
    %record = (%record, $more_func->(@more));

    return \%record;
}

while(my $line = <DATA>) {
    print Dumper parse_record($line);
}

__END__
thomas.            302     IN      MX      10 doug.local.
thomas.            300     IN      A       10.0.0.47
google.com.     24103   IN  NS  ns2.google.com.
使用严格;
使用警告;
使用数据::转储程序;
子记录{
我的$line=shift;
#用于分析不同类型的特殊规则
我的%More4Type=(
MX=>sub{return(优先级=>$\[0],提供程序=>$\[1]),
默认值=>sub{return(provider=>$\[0])}
);
我的%(记录,@更多);
(@record{qw(hostuhh类类型)},@more)=split/\s+/,$line;
my$more_func=$More4Type{$record{type}}| |$More4Type{default};
%记录=(%record,$more_func->(@more));
返回\%记录;
}
while(我的$line=){
打印转储程序解析_记录($line);
}
__结束__
托马斯。302在MX 10道格。本地。
托马斯在10.0.0.47的比赛中得到了300分
NS ns2.google.com中的google.com.24103。
现在您已经解析了这行代码,只需查看
$record{type}
$record{provider}
或您需要的任何内容即可。只需稍加努力,这将更加灵活,更不容易出现错误


尽管可能有一些东西可以帮您进行解析。

如果您只想匹配IPv4正则表达式,请使用

与其在整个生产线上运行正则表达式,不如更安全地标记它们并根据需要匹配各个部分

use strict;
use warnings;

use Data::Dumper;

sub parse_record {
    my $line = shift;

    # special rules for parsing different types
    my %More4Type = (
        MX      => sub { return( priority => $_[0], provider => $_[1] ) },
        default => sub { return( provider => $_[0] ) }
    );

    my(%record, @more);
    (@record{qw(host uhh class type)}, @more) = split /\s+/, $line;
    my $more_func = $More4Type{$record{type}} || $More4Type{default};
    %record = (%record, $more_func->(@more));

    return \%record;
}

while(my $line = <DATA>) {
    print Dumper parse_record($line);
}

__END__
thomas.            302     IN      MX      10 doug.local.
thomas.            300     IN      A       10.0.0.47
google.com.     24103   IN  NS  ns2.google.com.
使用严格;
使用警告;
使用数据::转储程序;
子记录{
我的$line=shift;
#用于分析不同类型的特殊规则
我的%More4Type=(
MX=>sub{return(优先级=>$\[0],提供程序=>$\[1]),
默认值=>sub{return(provider=>$\[0])}
);
我的%(记录,@更多);
(@record{qw(hostuhh类类型)},@more)=split/\s+/,$line;
my$more_func=$More4Type{$record{type}}| |$More4Type{default};
%记录=(%record,$more_func->(@more));
返回\%记录;
}
while(我的$line=){
打印转储程序解析_记录($line);
}
__结束__
托马斯。302在MX 10道格。本地。
托马斯在10.0.0.47的比赛中得到了300分
NS ns2.google.com中的google.com.24103。
现在您已经解析了这行代码,只需查看
$record{type}
$record{provider}
或您需要的任何内容即可。只需稍加努力,这将更加灵活,更不容易出现错误


虽然可能有什么东西可以帮你进行解析。

为什么你要将模式限制为0-5的数字?这怎么可能匹配192.168.x.x空间中的一个私有字符?…因为我突然开始考虑旧的(非CIDR网络掩码…将修复。为什么要发布未经测试的代码?您想要的是\s+,而不是\w+。您应该引用\,或者它匹配任何字符。正则表达式查找带有尾随点的地址。此代码可能工作的唯一原因是行末尾的\n作为地址的一部分进行了分析。请尝试:如果(/A\s+((?:[0-9]{1,3}\){3}[0-9]{1,3}/)为什么要将模式限制为0-5的数字?这怎么可能与192.168.x.x空间中的私有模式匹配?…因为我突然开始想到旧的(非CIDR网络掩码…将修复。为什么要发布未经测试的代码?您想要的是\s+,而不是\w+。您应该引用\,或者它匹配任何字符。正则表达式查找带有尾随点的地址。此代码可能工作的唯一原因是行末尾的\n作为地址的一部分进行了分析。请尝试:如果(/A\s+((?:[0-9]{1,3}\){3}[0-9]{1,3}/)这是正确的方法…只要验证四元结构的每个部分在0-25范围内。这是正确的方法…只要每个pa