Arrays 如何对数组进行反向排序,排序从行尾开始
我在LDAP数据库中有一堆地址,希望删除一条街道。为此,我必须首先拆除房屋。LDAP数据库输出未排序Arrays 如何对数组进行反向排序,排序从行尾开始,arrays,perl,sorting,ldap,reverse,Arrays,Perl,Sorting,Ldap,Reverse,我在LDAP数据库中有一堆地址,希望删除一条街道。为此,我必须首先拆除房屋。LDAP数据库输出未排序 my @x1=("c=NL", "nr=1,s=Dam,a=AMS,c=NL", "s=Dam,a=AMS,c=NL", "a=AMS,c=NL", "nr=3,s=Plein,a=AMS,c=NL", "s=Plein,a=AMS,c=NL", "nr=2,s=Dam,a=AMS,c=NL" )
my @x1=("c=NL",
"nr=1,s=Dam,a=AMS,c=NL",
"s=Dam,a=AMS,c=NL",
"a=AMS,c=NL",
"nr=3,s=Plein,a=AMS,c=NL",
"s=Plein,a=AMS,c=NL",
"nr=2,s=Dam,a=AMS,c=NL" );
在删除“s=Dam”之前,我们必须先删除“nr=1,s=Dam,a=AMS,c=NL”和“nr=2,s=Dam,a=AMS,c=NL”,然后才能删除“s=Dam,a=AMS,c=NL”
我选择的方向是从末端到前端对线进行排序,因此首先是“c=NL”,然后是“a=AMS”,依此类推。然后运行数组,如果它包含“s=Dam,a=AMS,c=NL”
结果应该是:
我在代码中添加了Data::Dumper以显示发生了什么
my @x1=("c=NL",
"nr=1,s=Dam,a=AMS,c=NL",
"s=Dam,a=AMS,c=NL",
"a=AMS,c=NL",
"nr=3,s=Plein,a=AMS,c=NL",
"s=Plein,a=AMS,c=NL",
"nr=2,s=Dam,a=AMS,c=NL" );
print Data::Dumper->Dump([\@x1],['*x1']);
my @x2=split( "\n", reverse join ("\n", @x1));
print Data::Dumper->Dump([\@x2],['*x2']);
my @x3=sort @x2;
print Data::Dumper->Dump([\@x3],['*x3']);
my @x4=split( "\n", reverse join ("\n", @x3));
print Data::Dumper->Dump([\@x4],['*x4']);
foreach (@x4) {
# if matches from the rear: "s=Dam,a=AMS,c=NL", do stuff
}
这就是结果
@x1 = (
'c=NL',
'nr=1,s=Dam,a=AMS,c=NL',
's=Dam,a=AMS,c=NL',
'a=AMS,c=NL',
'nr=3,s=Plein,a=AMS,c=NL',
's=Plein,a=AMS,c=NL',
'nr=2,s=Dam,a=AMS,c=NL'
); @x2 = (
'LN=c,SMA=a,maD=s,2=rn',
'LN=c,SMA=a,nielP=s',
'LN=c,SMA=a,nielP=s,3=rn',
'LN=c,SMA=a',
'LN=c,SMA=a,maD=s',
'LN=c,SMA=a,maD=s,1=rn',
'LN=c'
); @x3 = (
'LN=c',
'LN=c,SMA=a',
'LN=c,SMA=a,maD=s',
'LN=c,SMA=a,maD=s,1=rn',
'LN=c,SMA=a,maD=s,2=rn',
'LN=c,SMA=a,nielP=s',
'LN=c,SMA=a,nielP=s,3=rn'
); @x4 = (
'nr=3,s=Plein,a=AMS,c=NL',
's=Plein,a=AMS,c=NL',
'nr=2,s=Dam,a=AMS,c=NL',
'nr=1,s=Dam,a=AMS,c=NL',
's=Dam,a=AMS,c=NL',
'a=AMS,c=NL',
'c=NL'
);
这段代码是否可以改进,使代码更具可读性
sub reverse_terms { join ',', reverse split /,/, $_[0] }
my @sorted =
map reverse_terms($_),
reverse sort
map reverse_terms($_),
@unsorted;
或
上述解决方案改变了
s=Dam,a=AMS,c=NL
nr=1,s=Dam,a=AMS,c=NL
进入
然后,它们按降序对转换后的字符串进行排序。这会导致孩子出现在父母面前
c=NL,a=AMS,s=Dam,nr=1
c=NL,a=AMS,s=Dam
最后,这只是一个将字符串转换回(或者在
rkeysort
的情况下返回原始字符串)的问题。为什么join
之后是split
?为什么不@x2=reverse@x1
和@x4=reverse@x3
?如果我可以尝试简化你的问题:给定s=Dam,a=AMS,c=NL
,你的目标是提取包含s=Dam
的所有其他数组元素吗?“@x4=reverse@x3”反转数组,而不是数组中的字符串!这就是我要寻找的:反转数组中每个字符串中的项。我还学习了一些关于Schwartzian变换编码的知识。因为我使用了默认的sort
函数(比提供自己的函数更有效),所以这种特殊类型的ST称为GRT。
s=Dam,a=AMS,c=NL
nr=1,s=Dam,a=AMS,c=NL
c=NL,a=AMS,s=Dam
c=NL,a=AMS,s=Dam,nr=1
c=NL,a=AMS,s=Dam,nr=1
c=NL,a=AMS,s=Dam