perl中字母和十六进制的多重排序

perl中字母和十六进制的多重排序,perl,sorting,Perl,Sorting,我想按十六进制数和字母表对数组排序,但不知道如何排序。我的数组如下所示: my @array = ( "{John}{1} is a boy", "{Emily}{a} is a girl", ..., "{Alba}{f} is a brand" ); 我想首先按照字母表对第一个{}中的名称进行排序,然后按照第二个{}按照十六进制数进行排序,而不考虑后面的单词 my @sorted = sort { $a <=> $b } @array; my @sorted1 = s

我想按十六进制数和字母表对数组排序,但不知道如何排序。我的数组如下所示:

my @array = ( 
    "{John}{1} is a boy", "{Emily}{a} is a girl", ..., "{Alba}{f} is a brand"
);
我想首先按照字母表对第一个
{}
中的名称进行排序,然后按照第二个
{}
按照十六进制数进行排序,而不考虑后面的单词

my @sorted = sort { $a <=> $b } @array;
my @sorted1 = sort { hex $a <=> hex $b } @sorted;
print "@sorted1\n";
my@sorted=sort{$a$b}@array;
my@sorted1=sort{hex$a hex$b}@sorted;
打印“@sorted1\n”;
我尝试过这样的东西,但不起作用。如何按上述方式对数组进行排序?

排序{
sort {
   my @a_keys = $a =~ /\{([^{}]*)\}/g;
   my @b_keys = $b =~ /\{([^{}]*)\}/g;

   $a_keys[0] cmp $b_keys[0]
      ||
   hex($a_keys[1]) <=> hex($b_keys[1])
}
my@a_keys=$a=~/\{([^{}]*)\}/g; 我的@b\u键=$b=~/\{([^{}]*)\}/g; $a_键[0]cmp$b_键[0] || 十六进制($a_键[1])十六进制($b_键[1]) }
我希望您的代码不起作用的原因显而易见

my @sorted = sort { $a <=> $b } @array;
my @sorted1 = sort { hex $a <=> hex $b } @sorted;
如果
sort\u expression\u 1
返回-1或1,则为真,布尔表达式在该点“短路”。如果两个值相同,则
sort\u expression\u 1
返回0,布尔表达式继续计算
sort\u expression\u 2

那么我们到底想按什么来排序呢?好的,我们需要提取大括号之间的字符串并按它们排序。也许是这样的:

my @sorted = sort {
  # Extract the sortable bits into arrays
  my @a_bits = $a =~ /\{(.+?)}/g;
  my @b_bits = $b =~ /\{(.+?)}/g;

  # Compare the strings
  $a_bits[0] cmp $b_bits[0]
    or
  # If the strings are the same, compare the hex numbers
  hex($a_bits[1]) <=> hex($b_bits[i])
} @array;
my@sorted=sort{
#将可排序位提取到数组中
我的@a_位=$a=~/\{(+?)}/g;
我的@b_位=$b=~/\{(+?)}/g;
#比较字符串
$a_位[0]cmp$b_位[0]
或
#如果字符串相同,请比较十六进制数
十六进制($a_位[1])十六进制($b_位[i])
}@数组;
为了更有效地排序,可以使用“”,它在开始实际排序之前将要排序的位分隔开

my @sorted =
  map { $_->[0] }
  sort { $a->[1] cmp $b->[1] or hex($a->[2]) <=> hex($b->[2]) }
  map { [ $_, /\{(.+?)}/g ] } @array;
my@sorted=
映射{$\->[0]}
排序{$a->[1]cmp$b->[1]或十六进制($a->[2])十六进制($b->[2])]
映射{[$\,/\{(.+?)}/g]}@array;

Hi,我不知道如何将上面的代码添加到我的@array中。你能给我解释一下吗?
@sorted=sort{}@array
;这种类型的排序将大大受益于a。感谢@Dave的清晰解释。这有助于我更好地理解
排序
my @sorted = sort {
  # Extract the sortable bits into arrays
  my @a_bits = $a =~ /\{(.+?)}/g;
  my @b_bits = $b =~ /\{(.+?)}/g;

  # Compare the strings
  $a_bits[0] cmp $b_bits[0]
    or
  # If the strings are the same, compare the hex numbers
  hex($a_bits[1]) <=> hex($b_bits[i])
} @array;
my @sorted =
  map { $_->[0] }
  sort { $a->[1] cmp $b->[1] or hex($a->[2]) <=> hex($b->[2]) }
  map { [ $_, /\{(.+?)}/g ] } @array;