perl中的自定义数组排序

ABa*_*ach 6 arrays sorting perl

我有一组perl do-do任务看起来像这样:

@todos = (
  "1 (A) Complete online final @evm4700 t:2010-06-02",
  "3 Write thank-you t:2010-06-10",
  "4 (B) Clean t:2010-05-30",
  "5 Donate to LSF t:2010-06-02",
  "6 (A) t:2010-05-30 Pick up dry cleaning",
  "2 (C) Call Chris Johnson t:2010-06-01"
);
Run Code Online (Sandbox Code Playgroud)

第一个数字是任务的ID.如果任务旁边有([AZ]),则定义任务的优先级.我想要做的是以一种将优先级项放在第一位的方式对任务数组进行排序(按优先顺序递减,从A-Z开始):

@todos = (
  "1 (A) Complete online final @evm4700 t:2010-06-02",
  "6 (A) t:2010-05-30 Pick up dry cleaning",
  "4 (B) Clean t:2010-05-30",
  "2 (C) Call Chris Johnson t:2010-06-01"
  "3 Write thank-you t:2010-06-10",
  "5 Donate to LSF t:2010-06-02",
);
Run Code Online (Sandbox Code Playgroud)

我不能使用常规sort()因为任务旁边的ID,所以我假设需要某种自定义的排序子程序.但是,我对如何在perl中高效地完成此任务的知识很少.

谢谢,所有.

Sea*_*ean 12

听起来你想要Schwartzian变换:

@todos =
    map  { $_->[0] }
    sort { $a->[1] cmp $b->[1] or $a->[0] cmp $b->[0] }
    map  { [ $_, /^\d+ \(([[:alpha:]])\)/ ? $1 : "[" ] }
    @todos;
Run Code Online (Sandbox Code Playgroud)

"["是"Z"后的字符; 将这个"优先级"赋予其他未优先级的项目将在优先级项目之后对它们进行排序.

或者,也许更容易掌握:

@todos =
    map { substr $_, 1 }
    sort
    map { (/^\d+ \(([[:alpha:]])\)/ ? $1 : "[") . $_ }
    @todos;
Run Code Online (Sandbox Code Playgroud)

  • @Sean - 这是一个很酷的解决方案; 谢谢.你需要逃避那个`]`ater:alpha:?@Zaid - 尽管我是初学者,但@Sean给了我解释Schwartzian变换的链接,所以我能理解它.:) (2认同)
  • `10`应该在'9`之后(你需要数字排序) (2认同)