使用 Perl 使用 RegEx 或符号后面出现的值对数组进行排序

RFA*_*RFA 2 arrays sorting 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>
);
Run Code Online (Sandbox Code Playgroud)

我想对打开 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>
Run Code Online (Sandbox Code Playgroud)

我无法将其转换为哈希,因为这会消除由于复制而产生的标签。我尝试了这个,但它没有对它们进行排序:

    my @sorted_all = sort {
    my ($aa, $bb) = map { (split)[1] } $a, $b;
    $bb <=> $aa;
} @all;
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

使用Sort::Key

use strict;
use warnings;
use feature qw(say);

use Sort::Key qw(keysort);

my @all = ( 
    q{<side.effect signif="life.threat">myocardial infarctio</side.effect>},
    q{<side.effect signif="life.threat">hypersensitivity reations</side.effect>},
    q{<side.effect signif="life.threat">lactic acidosis</sid.effect>},
    q{<side.effect signif="most.freq">vomiting</side.effect>},
    q{<side.effect signif="most.freq">diarrhea</side.effect>},
);


my @sorted = keysort { ( /">(.+?)<\// )[0] } @all;  

say for @sorted;
Run Code Online (Sandbox Code Playgroud)

该库在需要时使用Schwartzian 变换,首先为所有项目构建比较模式(并且不在每对比较时重新执行)。我复制了给定的输入,包括错别字等等。

使用正则表达式解析 XML 标记依赖于这种非常特定的输入格式。如果格式存在变化,请使用适当的 XML 解析器,例如XML::LibXML。例如

use XML::LibXML;

my $parser = XML::LibXML->new;

my @sorted = keysort {
    $parser -> parse_string($_)
        -> findnodes('side.effect') -> [0]
        -> textContent
} @all;
Run Code Online (Sandbox Code Playgroud)

对于此代码,请参阅XML::LibXML::ParserXML::LibXML::Node。该库附带了更多文档,请参阅第一次提到时链接的顶部文档。

为此,我必须纠正sid.effect一个节点中的拼写错误,以获得有效的 XML。