我正在为一个项目编写一个perl程序,该项目将读取包含IP地址和MAC地址的文件,如下所示:
#host itvm28-5.it.cs.umb.edu {
# hardware ethernet 00:0c:29:fe:bf:b5;
# fixed-address 10.0.0.167;
#}
有许多这样的线路具有不同的IP和MAC地址组合。我想做的是用reg表达式提取IP和MAC,然后将它们彼此相邻配对。我有一些我认为有用的东西,但它印刷重复。我相信在某些情况下它也不匹配。
以下是我目前的代码:
#!/usr/bin/perl
open( DHCP, '<', 'dhcpd.conf' ) or die $!;
while ( my $addr = <DHCP> ) {
if ( $addr =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ ) {
@ip = ($1);
}
if ( $addr =~ /(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})/ ) {
@mac = ($1);
}
my %ipmac;
@ipmac{@ip} = @mac;
print %ipmac, "\n";
}
close DHCP;
以下是我目前通过此计划获得的输出:
10.0.0.16300:0c:29:a1:2f:69
10.0.0.16300:0c:29:a1:2f:69
10.0.0.16300:0c:29:a1:2f:69
10.0.0.16300:0c:29:c6:40:2a
10.0.0.16400:0c:29:c6:40:2a
10.0.0.16400:0c:29:c6:40:2a
10.0.0.16400:0c:29:c6:40:2a
10.0.0.16400:0c:29:c6:40:2a
10.0.0.16400:0c:29:b9:24:c5
10.0.0.16500:0c:29:b9:24:c5
10.0.0.16500:0c:29:b9:24:c5
10.0.0.16500:0c:29:b9:24:c5
10.0.0.16500:0c:29:b9:24:c5
10.0.0.16500:0c:29:94:c0:85
10.0.0.16600:0c:29:94:c0:85
10.0.0.16600:0c:29:94:c0:85
10.0.0.16600:0c:29:94:c0:85
10.0.0.16600:0c:29:94:c0:85
10.0.0.16600:0c:29:fe:bf:b5
10.0.0.16700:0c:29:fe:bf:b5
10.0.0.16700:0c:29:fe:bf:b5
10.0.0.16700:0c:29:fe:bf:b5
如您所见,某些IP地址将包含多个MAC地址。更糟糕的是,我们可以看到它重复了关键的价值对。任何人都可以在我的代码中看到为什么会发生这种情况以及如何解决它?
非常感谢, 莱恩
答案 0 :(得分:1)
您的循环对输入文件中的每一行执行一次,并且您在每个循环中打印(因此您为每个输入行打印一个输出行)。
您没有明确声明@ip
或@mac
,这意味着它们具有文件范围,即。它们保持了从循环的前一次迭代中获得的值。这就是你重复打印的原因。
使用您拥有的数据集的最佳方法是将$/
(输入记录分隔符)更改为"\n}\n"
,以便在每次<DHCP>
读取时获得完整记录,然后你将为每个实际输入记录做一个循环,而不是每行。