【问题标题】:sort numbers numerically and strings alphabetically in an array of hashes perl在散列数组中按数字和字母顺序对数字进行排序 perl
【发布时间】:2020-09-16 01:04:11
【问题描述】:

这是一个非常简单的问题,但我无法解决它。我有一个哈希数组。数据结构如下:

my @unsorted = (
    {
        'key_5' => '14.271 text',
        # ...
    },
    {
        'key_5' => 'text',
        # ...
    },
    {
        'key_5' => '13.271 text',
        # ...
    },
    {
        'key_5' => 'etext',
        # ...
    },
);

如何根据哈希的key_5 对数组进行排序。字符串部分应按字母顺序排序。并且键是number string(格式总是这样),它应该按数字排序(完全忽略字符串部分)。所以输出看起来像:

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

【问题讨论】:

  • 除非这是一个家庭作业(在这种情况下你不应该寻求我们的帮助),你绝对可以使用非核心模块的函数。您可以使用local::lib 并将其安装到您的主目录(或等效目录)。您可以将模块放入项目的lib/ 子目录并从那里使用它。最坏的情况是,只要它是纯 Perl 模块(Sort::Key::Natural 是),您就可以将相关代码直接复制/粘贴到您的程序中。 (而 S::K::N 仅 104 行长,因此如果您愿意,甚至可以将整个模块复制到源文件中。)
  • @DaveSherohman 首先,这不是家庭作业。其次,我不允许安装任何将用于生产的库。我知道这只是复制粘贴,但这样做会违反机构的规则。所以我的手被绑在已经安装的模块上。
  • @DaveSherohman:我不认为Sort::Key::Natural 是纯粹的 Perl,因为我看到了Key.xs。但是,看起来Sort::Naturally 可能是,而且可能是合适的。
  • @toolic - 公平点。我只看了 S::K::N 本身的来源,忘记检查它的依赖关系。

标签: perl sorting numeric alphabetical-sort


【解决方案1】:

使用Sort::Key::Natural:

use Sort::Key::Natural qw( natkeysort );

my @sorted = natkeysort { $_->{key_5} } @unsorted;

以上内容从您的输入中产生以下内容:

[
    {
        '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 安装不附带的软件包。我会更新我的问题。对此感到抱歉。
  • 这应该很容易适应sort,尤其是当您将它用作Schwartzian Transform 的一部分时
  • 能否请你指导我或给我一个关于如何适应它的提示。那我可以试一试。我已经通过改变我的数据结构完成了手头的任务,但我渴望解决这个挑战。
  • 我做到了。我链接到一个解释的文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多