0

次の配列があります。

  my @anim = ('rn4,mm8,bosTau2,canFam2,dasNov1,echTel1',
  'rn4,mm8,oryCun1,bosTau2,canFam2,dasNov1,echTel1');

複数の文字列が含まれており、各文字列はコンマで区切られています。私がやりたいのは、文字列の最大のメンバーに基づいてそれらを並べ替えることです。したがって、私がやろうとしたことはこれです:

my @animsort = sort{scalar(split(",",$b)) <=> scalar(split(",",$a))} @anim;

しかし、次のエラーが発生します。

Use of implicit split to @_ is deprecated at ./scripts/mycode.pl line 35

それを行う正しい方法は何ですか?

4

4 に答える 4

6

「最大のメンバー」が最後のメンバーを意味する場合は、リストスライスを使用します。

my @sorted_anim = sort {
    (split /,/, $b)[-1] cmp (split /,/, $a)[-1]
} @anim;

シュワルツ変換の使用:

my @sorted_anim = map $_->[0],
    sort { $b->[1] cmp $a->[1] }
    map [ $_, (split /,/, $_)[-1] ],
    @anim;

またはGuttman-RoslerTransform:

my @sorted_anim = map /,(.*)/s,
    sort { $b cmp $a }
    map { (split /,/, $_)[-1] . ",$_" }
    @anim;

シュワルツ変換は、要素ごとに1回だけソートキーを計算することにより、効率を向上させることを目的としています。Guttman-Roslerは、perlが最適化されたビルドを使用するように、ソートキーを完全なデータ(多くの場合、ソートキーの長さが既知のパック、ここでは既知の区切り文字のみ)と一時的に組み合わせることで、さらに優れています。 -比較ごとにperlコードを実行する代わりに、ソートルーチンで。

于 2013-02-12T08:34:01.487 に答える
2

各文字列の要素数で並べ替える場合は、コードでそれを行います。Perl5.16で投稿されたコードでエラーは発生しません。古いバージョンのPerlをお持ちですか?(私はあなたのコードが古いバージョンでエラーを生成するかもしれないといういくつかの証拠を見つけました)。

別のオプションは次のとおりです。

my @animsort = sort{(() = $b =~ /,/g) <=> (() = $a =~ /,/g)} @anim;

これは、実際に文字列を分割するのではなく、コンマを数えることによってソートされます。面白い() =構文は、正規表現がリストコンテキストにあるものとして扱われるようにすることです。これにより、一致をカウントできます。

于 2013-02-12T08:36:28.923 に答える
2

scalar()「文字列の最大のメンバー」を返さないか、そうする原因splitにはなりません。多分あなたはList::Utilを探していますmaxstrか?

use List::Util qw( maxstr );

my @sorted_anim = sort {
   maxstr(split /,/, $b) cmp maxstr(split /,/, $a)
} @anim;
于 2013-02-12T08:28:27.037 に答える
0

正規表現はすべてをソールするか、「警告なし」で警告を削除できます。プラグマをローカルに。

my $comma_re = qr!,!;   
my @animsort = sort{$b =~ s!$comma_re!!g <=> $a =~ s!$comma_re!!g} @anim;
print Dumper(\@anim,\@animsort);
于 2013-02-12T09:06:51.960 に答える