Perl实现HHHH.HHHH.HHHH格式MAC地址转HH:HH:HH:HH:HH:HH格式
Perl实现MAC地址格式转换(点分四段式转冒号分隔两位式)
需求说明
需要将输入格式为HHHH.HHHH.HHHH(H为十六进制字符,即网络设备常见的思科风格点分MAC,每段4个十六进制位,共3段)的MAC地址,转换为通用标准格式HH:HH:HH:HH:HH:HH,且需要嵌入现有LLDP信息解析脚本,对提取到的$chassisID变量做处理。
核心实现逻辑
转换分三步完成:
- 对提取到的原始值做首尾空白去除,避免正则匹配带的多余空格影响处理
- 移除MAC字符串中所有的点分隔符,得到连续12位的十六进制字符串
- 将连续字符串按每2位为一组拆分,组间用冒号拼接,得到目标格式MAC
适配现有代码的修改方案
你原有代码中匹配Chassis ID的逻辑不需要改动,只需要在提取到$chassisID后增加转换步骤即可,修改后的完整代码片段如下:
if ($linha =~m/^Chassis ID/){ my($chassisID) = $linha=~ /:(.*)/g; # 以下为新增的MAC格式转换逻辑 $chassisID =~ s/^\s+|\s+$//g; # 去除首尾多余空白 my $mac_no_dot = $chassisID; $mac_no_dot =~ s/\.//g; # 删除所有点分隔符 # 按每2位拆分后用冒号拼接 my $mac_standard = join(':', unpack('(A2)*', $mac_no_dot)); # 存储转换后的标准MAC到结果哈希 $lldpInfo{$localInt}{"chassisID"} = $mac_standard; print "转换完成的标准MAC: ".$mac_standard."\n"; }
效果验证
用你提供的示例输入测试:
- 原始行提取的初始
$chassisID值:4cf5.5b8b.f860(带前导空格) - 空白清理+去点后得到连续字符串:
4cf55b8bf860 - 最终转换输出:
4c:f5:5b:8b:f8:60,完全符合HH:HH:HH:HH:HH:HH的格式要求。
可选优化
- 增加合法性判断:在转换前先判断
Chassis type字段值为MAC address时再执行转换,避免其他类型的Chassis ID被错误处理 - 统一大小写:如果需要MAC地址统一为大写/小写,可以在转换后调用
uc($mac_standard)转大写,或lc($mac_standard)转小写 - 正则写法替代:如果不习惯用unpack拆分,也可以用正则替换实现拼接,代码如下:
my $mac_standard = $mac_no_dot =~ s/([0-9a-fA-F]{2})/$1:/gr; $mac_standard =~ s/:$//; # 去掉末尾多余的冒号
内容的提问来源于stack exchange,提问作者ExploitZ
相关产品推荐
相关产品推荐

