如何在Perl中遍历多个数组批量修改XML配置文件数值
Perl完全可以实现该需求,最高效的实现方式是将重复的节点修改逻辑封装为可复用的子程序,配合数组索引遍历完成批量修改,既可以消除冗余代码,也能适配多场景复用的需求。
基础循环实现(针对当前场景)
你存储路径和值的两个数组下标是一一对应的,直接遍历数组下标即可替换原有逐行编写的逻辑:
# 遍历0到数组最后一位的下标 for my $i (0 .. $#GreetSIDSunDP1) { my ($match_node) = $xpc->findnodes($GreetSIDSunDP1[$i]); $match_node->removeChildNodes(); $match_node->appendText($GreetGoalDP1[$i]); }
可复用封装方案(满足多次调用需求)
把修改逻辑封装为公共子程序,其他需要修改配置的场景直接传参调用即可,无需重复编写节点操作逻辑:
# 公共批量修改XML配置子程序 # 入参依次为:XPath上下文对象、XPath路径数组引用、配置值数组引用 sub batch_update_xml_settings { my ($xpc, $xpath_arr, $value_arr) = @_; # 校验两个数组长度一致,避免下标错位 die "XPath数组和值数组长度不匹配" unless @$xpath_arr == @$value_arr; for my $i (0 .. $#$xpath_arr) { my ($match_node) = $xpc->findnodes($xpath_arr->[$i]); # 可选:增加节点存在校验,避免XPath错误导致程序崩溃 next unless $match_node; $match_node->removeChildNodes(); $match_node->appendText($value_arr->[$i]); } }
你当前场景的调用方式:
batch_update_xml_settings($xpc, \@GreetSIDSunDP1, \@GreetGoalDP1);
可选优化建议
如果担心两个独立数组容易出现长度不匹配、下标错位的问题,可以直接把路径和值绑定存储在同一个二维数组中,可靠性更高:
my @greet_settings = ( ['//xsd:Settings/xsd:Setting[@SID="7012"]/xsd:Value', 3], ['//xsd:Settings/xsd:Setting[@SID="7013"]/xsd:Value', 5], ['//xsd:Settings/xsd:Setting[@SID="7014"]/xsd:Value', 7], ['//xsd:Settings/xsd:Setting[@SID="7015"]/xsd:Value', 10], );
对应的子程序可以适配为仅接收这个二维数组作为入参,进一步降低出错概率。
内容的提问来源于stack exchange,提问作者Taylor Stevens
相关产品推荐
相关产品推荐

