我有一组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" );
第一个数字是任务的ID.如果任务旁边有([A-Z]),则定义任务的优先级.我想要做的是以一种将优先级项放在第一位的方式对任务数组进行排序(按优先顺序递减,从A-Z开始):
@todos = ( "1 (A) Complete online final @evm4700 t:2010-06-02","2 (C) Call Chris Johnson t:2010-06-01" "3 Write thank-you t:2010-06-10",);
我不能使用常规sort()因为任务旁边的ID,所以我假设需要某种自定义排序子程序.但是,我对如何在perl中高效地完成此任务的知识很少.
谢谢,所有.
解决方法
听起来你想要
Schwartzian transform:
@todos = map { $_->[0] } sort { $a->[1] cmp $b->[1] or $a->[0] cmp $b->[0] } map { [ $_,/^\d+ \(([[:alpha:]])\)/ ? $1 : "[" ] } @todos;
“[”是“Z”后的字符;将这个“优先级”赋予其他未优先级的项目将在优先级项目之后对它们进行排序.
或者,也许更容易掌握:
@todos = map { substr $_,1 } sort map { (/^\d+ \(([[:alpha:]])\)/ ? $1 : "[") . $_ } @todos;