如何对数组进行反向排序,排序从行尾开始
How to reverse sort an array, sort starts on the end of the line
我在 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" );
在删除'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".
结果应该看起来像:
'nr=2,s=Dam,a=AMS,c=NL'
'nr=1,s=Dam,a=AMS,c=NL'
'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;
或
use Sort::Key qw( rkeysort );
my @sorted = rkeysort { join ',', reverse split /,/ } @unsorted;
以上解变换
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
然后,他们将转换后的字符串按降序排列。这会导致 children 出现在 parents.
之前
c=NL,a=AMS,s=Dam,nr=1
c=NL,a=AMS,s=Dam
最后只是将字符串转换回来的问题(或者返回原始字符串,在rkeysort
的情况下)。
我在 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" );
在删除'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".
结果应该看起来像:
'nr=2,s=Dam,a=AMS,c=NL' 'nr=1,s=Dam,a=AMS,c=NL' '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;
或
use Sort::Key qw( rkeysort );
my @sorted = rkeysort { join ',', reverse split /,/ } @unsorted;
以上解变换
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
然后,他们将转换后的字符串按降序排列。这会导致 children 出现在 parents.
之前c=NL,a=AMS,s=Dam,nr=1
c=NL,a=AMS,s=Dam
最后只是将字符串转换回来的问题(或者返回原始字符串,在rkeysort
的情况下)。