Perl 在哈希数组中对数字和字符串按字母顺序进行排序

Perl 在哈希数组中对数字和字符串按字母顺序进行排序,perl,sorting,numeric,alphabetical-sort,Perl,Sorting,Numeric,Alphabetical Sort,这是一个很容易解决的问题,但我解决不了。我有一个哈希数组。数据结构如下所示: my @unsorted = ( { 'key_5' => '14.271 text', # ... }, { 'key_5' => 'text', # ... }, { 'key_5' => '13.271 text', # ... }, {

这是一个很容易解决的问题,但我解决不了。我有一个哈希数组。数据结构如下所示:

my @unsorted = (
    {
        'key_5' => '14.271 text',
        # ...
    },
    {
        'key_5' => 'text',
        # ...
    },
    {
        'key_5' => '13.271 text',
        # ...
    },
    {
        'key_5' => 'etext',
        # ...
    },
);
如何根据散列的
键5
对数组进行排序。字符串部分应按字母顺序排序。如果键是
数字字符串
(格式总是这样),则应按数字排序(完全忽略字符串部分)。因此,输出将如下所示:

my @sorted = (
    {
        'key_5' => 'etext',
        # ...
    },
    {
        'key_5' => 'text',
        # ...
    },
    {
        'key_5' => '13.271 text',
        # ...
    },
    {
        'key_5' => '14.271 text',
        # ...
    },
);
因此,数组元素根据散列元素的
key_5
进行排序

重要提示:无法使用本机perl安装中未附带的任何perl包。使用perl 5.18

使用:

以上内容通过您的输入生成以下内容:

[
    {
        'key_5' => '13.271 text'
        # ...
    },
    {
        'key_5' => '14.271 text'
        # ...
    },
    {
        'key_5' => 'etext'
        # ...
    },
    {
        'key_5' => 'text'
        # ...
    },
]
如果这还不够好,可以使用以下方法:

use Sort::Key::Multi qw( unskeysort );   # uns = (u)nsigned int, (n)umber, (s)tring

my @sorted =
   unskeysort {
      $_->{key_5} =~ /^([0-9.]+)\s+(.*)/s
         ? ( 1, $1, $2 )
         : ( 0, 0, $_->{key_5} )
   }
      @unsorted;

好。。这很糟糕,我不能使用没有本机perl安装的包。我会更新我的问题。很抱歉。这应该很容易适应
排序
,特别是如果您将其用作排序的一部分,请您指导我或给我一个如何适应排序的提示。那我可以试试看。通过改变数据结构,我已经完成了手头的任务,但我渴望解决这个挑战。我做到了。我链接到一个文档,它解释了这是一个家庭作业(在这种情况下,你无论如何都不应该寻求我们的帮助),你绝对可以使用非核心模块的函数。您可以使用
local::lib
并将其安装到主目录(或等效目录)。您可以将模块放入项目的
lib/
子目录中,并从那里使用它。最糟糕的情况是,只要它是一个纯Perl模块(Sort::Key::Natural就是),就可以将相关代码直接复制/粘贴到程序中。(而且S::K::N只有104行长,因此如果您愿意,您甚至可以将整个模块复制到源文件中。)@DaveSherohman首先,这不是家庭作业。其次,我不允许安装任何用于生产的库。我知道这只是一个复制粘贴,但这样做会违反学校的规定。所以我的手被束缚在已经安装的模块上。@DaveSherohman:我不认为
Sort::Key::Natural
是纯Perl,因为我看到
Key.xs
。但是,它看起来像是
Sort::自然而然地
可能是,而且它可能是合适的。@toolic-Fair point。我只查看了S::K::N本身的源代码,忘了检查它的依赖关系。
use Sort::Key::Multi qw( unskeysort );   # uns = (u)nsigned int, (n)umber, (s)tring

my @sorted =
   unskeysort {
      $_->{key_5} =~ /^([0-9.]+)\s+(.*)/s
         ? ( 1, $1, $2 )
         : ( 0, 0, $_->{key_5} )
   }
      @unsorted;