如何使用Perl根据XML标签>后的内容对数组排序
按XML标签后的文本内容对Perl数组排序
原始数组
我有如下Perl数组:
@all = ( '<side.effect signif="life.threat">myocardial infarction</side.effect>', '<side.effect signif="life.threat">hypersensitivity reactions</side.effect>', '<side.effect signif="life.threat">lactic acidosis</side.effect>', '<side.effect signif="most.freq">vomiting</side.effect>', '<side.effect signif="most.freq">diarrhea</side.effect>', );
期望输出
希望根据XML起始标签属性后的>字符之后的内容对数组排序,得到如下结果:
<side.effect signif="most.freq">diarrhea</side.effect> <side.effect signif="life.threat">hypersensitivity reactions</side.effect> <side.effect signif="life.threat">lactic acidosis</side.effect> <side.effect signif="life.threat">myocardial infarction</side.effect> <side.effect signif="most.freq">vomiting</side.effect>
尝试过的无效代码
由于存在重复标签,无法转换为哈希表,尝试了以下代码但未实现排序:
my @sorted_all = sort { my ($aa, $bb) = map { (split)[1] } $a, $b; $bb <=> $aa; } @all;
解决方案
你之前的代码问题在于用split的方式无法正确提取到需要排序的目标文本。正确做法是用正则表达式捕获>之后到</side.effect>之前的副作用名称,再基于该文本排序:
my @sorted_all = sort { # 提取每个元素中需要排序的核心文本 my ($a_content) = $a =~ />(.*?)<\/side\.effect>/; my ($b_content) = $b =~ />(.*?)<\/side\.effect>/; # 按文本升序排序 $a_content cmp $b_content; } @all;
解释:
- 正则表达式
/(.*?)<\/side\.effect>/会精准匹配>之后的内容,直到遇到</side.effect>,捕获这部分文本作为排序依据 - 使用字符串比较运算符
cmp进行升序排序,最终得到期望的排序结果
内容的提问来源于stack exchange,提问作者RFA
相关产品推荐
相关产品推荐

