大佬教程收集整理的这篇文章主要介绍了使用Perl对具有特定字母顺序的字符串进行排序,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试处理sort {$a MyFunction $b},但我是Perl的新手,我不知道如何正确组织MyFunction以获得我想要的东西.
>是否有提供此功能的特定功能(包)?
>你有一个处理字符串的自定义排序函数的例子吗?
>你知道如何(或在哪个源文件中)使用Perl实现的cmp函数来查看它是如何工作的?
sub my_compare($$) { $_[0] =~ tr{abdrtwsuiopqe987654}{abcdefghijklmnopqrs}r cmp $_[1] =~ tr{abdrtwsuiopqe987654}{abcdefghijklmnopqrs}r } my @sorted = sort my_compare @unsorted;
或者如果你想要更动态的东西,以下可能是最快的[2]:
@H_154_14@my @syms = split //,'abdrtwsuiopqe987654'; my @map; $map[ord($syms[$_])] = $_ for 0..$#syms; sub my_compare($$) { (pack 'C*',map $map[ord($_)],unpack 'C*',$_[0]) cmp (pack 'C*',$_[1]) } my @sorted = sort my_compare @unsorted;我们可以逐字逐句地比较,但这会慢得多.
use List::Util qw( min ); my @syms = split //,'abdrtwsuiopqe987654'; my @map; $map[ord($syms[$_])] = $_ for 0..$#syms; sub my_compare($$) { my $l0 = length($_[0]); my $l1 = length($_[1]); for (0..min($l0,$l1)) { my $ch0 = $map[ord(substr($_[0],$_,1))]; my $ch1 = $map[ord(substr($_[1],1))]; return -1 if $ch0 < $ch1; return +1 if $ch0 > $ch1; } return -1 if $l0 < $l1; return +1 if $l0 > $l1; return 0; } my @sorted = sort my_compare @unsorted;
>从技术上讲,使用GRT可以更快地完成.
@H_154_14@my @sorted = map /\0(.*)/s,sort map { tr{abdrtwsuiopqe987654}{abcdefghijklmnopqrs}r . "\0" . $_ } @unsorted;>从技术上讲,sort map { ( pack 'C*',$_ ) . "\0" . $_ } @unsorted;
cmp由scmp运算符实现.
$perl -MO=Concise,-exec -e'$x cmp $y' 1 <0> enter 2 <;> nextstate(main 1 -e:1) v:{ 3 <#> gvsv[*x] s 4 <#> gvsv[*y] s 5 <2> scmp[t3] vK/2 6 <@> leave[1 ref] vKP/REFC
scmp操作符由pp.c
中的pp_scmp函数实现,当使用locale时,它实际上只是sv.c
中sv_cmp_flags的包装器;没有效果. sv_cmp_flags使用C库函数memcmp
或UTF-8识别版本(取决于标量的类型).
以上是大佬教程为你收集整理的使用Perl对具有特定字母顺序的字符串进行排序全部内容,希望文章能够帮你解决使用Perl对具有特定字母顺序的字符串进行排序所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。