如何匹配Perl中的IP地址?

时间:2009-12-28 21:36:26

标签: 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_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。

6 个答案:

答案 0 :(得分:3)

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

不是在整行上运行正则表达式,而是更加安全地对它们进行标记化并根据需要匹配各个部分。

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.

现在您已经解析了这条线,只需查看$record{type}$record{provider}或您需要的任何内容即可。为了一点点努力,这更灵活,更容易出错。

尽管CPAN上可能还有一些东西要为你解析。

答案 1 :(得分:2)

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

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

# IP was: 10.0.0.47

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

试试这个:

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

这将检查A后跟空格,后跟虚线四边形。四元组保存在变量$ record_ip

答案 4 :(得分:0)

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";
}

答案 5 :(得分:0)

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

use Socket;

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

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