-1

次のような文字列があります。

"PQR23 on abc62", "PQR112 on efg7", "PQR9 on efg76" and so on

ここで、この文字列を最初の文字に数字を付けて昇順に並べたいと思います。

したがって、期待される出力は

PQR112 on efg7
PQR23 on abc62
PQR9 on efg76 

等々

私はperlを初めて使用し、宿題をしてネットで検索していますが、これまでのところ完璧なソリューションを受け取っていません。ありがとう。

4

3 に答える 3

3

単純な字句ソートでは提供されない、あなたが何を望んでいるのかわかりません。以下のプログラムは、あなたが指定したことを行うようです。

use strict;
use warnings;

my @strings = (
  "PQR23 on abc62",
  "PQR112 on efg7", 
  "PQR9 on efg76",
);

print "$_\n" for sort @strings;

出力

PQR112 on efg7
PQR23 on abc62
PQR9 on efg76

編集

プレフィックス文字を無視したい場合は、並べ替えのコード ブロックでうまくいきます

use strict;
use warnings;

my @strings = (
  "ABC23 on abc62",
  "PQR112 on efg7", 
  "XYZ9 on efg76",
);

print "$_\n"  for sort {
  my ($aa) = $a =~ /(\d)/;
  my ($bb) = $b =~ /(\d)/;
  $aa cmp $bb;
} @strings;

出力

PQR112 on efg7
ABC23 on abc62
XYZ9 on efg76
于 2012-04-13T06:51:06.700 に答える
2

そのようにSchwartzian Transformを使用することもできます。配列が大きい場合は非常に効率的です。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @strings = (
  "PQR23 on abc62",
  "PQR112 on efg7", 
  "PQR9 on efg76",
);

my @result = 
    map { $_->[0] }
    sort { $a->[1] <=> $b->[1]}
    map { [$_, /(\d)/] }
    @strings;

print Dumper\@result;

出力:

$VAR1 = [
          'PQR112 on efg7',
          'PQR23 on abc62',
          'PQR9 on efg76'
        ];
于 2012-04-13T12:38:29.893 に答える
0
use strict;
use warnings;
my @sorted_strings=sort("PQR23 on abc62", "PQR112 on efg7", "PQR9 on efg76");
print join ("\n",@sorted_strings);

出力

PQR112 on efg7
PQR23 on abc62
PQR9 on efg76
于 2012-04-13T07:12:31.840 に答える