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

pexxcrt2  于 10个月前  发布在  Perl
关注(0)|答案(1)|浏览(63)

我有一个数组:

@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;

5cg8jx4n

5cg8jx4n1#

使用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;

字符串
当需要时,库使用Schwartzian Transform,首先为所有项目构建比较模式(而不是在每个对比较时重新构建)。我复制了输入,错别字和所有。
使用正则表达式解析XML标记依赖于这种非常特定的输入格式。如果格式有变化,请使用适当的XML解析器,如XML::LibXML。比如说

use XML::LibXML;

my $parser = XML::LibXML->new;
my @sorted = keysort {
    $parser -> parse_string($_)
        -> findnodes('side.effect') -> [0]
        -> textContent
} @all;


有关此代码,请参见XML::LibXML::ParserXML::LibXML::Node。还有更多的文档,请参阅第一次提到的顶部文档链接。还有其他一些很好的XML库。

  • 为此,我必须更正一个节点中的错别字sid.effect,以便获得有效的XML。*

相关问题