-1

たとえば、ファイル内の文字を A から Z に並べ替えようとしています: a AB drg sorted: A a B dgr

@ARGV == 2 or die "Usage: $0 infile outfile\n";
open $old,  '<', $ARGV[0] or die $!;
open $new, '>', $ARGV[1] or die $!;
@mass=<$old>;
@array=qw(@mass);
@sort=sort @array;
@mass1=sort {uc $a cmp uc $b} @sort;
print $new @mass1;

どこが間違っていますか?

4

3 に答える 3

3

標準のテキスト順序付けが ASCII ベースであることを理解していないと思います。したがって、すべての大文字がすべての小文字に続くため、同じことが入力にも当てはまります。したがって、ストレートの注文sortは になります( 'A', 'B', 'a', 'd', 'g', 'r' )

2 つの文字列を二重に比較したいとします。この場合、ソートするルーチンを渡す必要があります。

@sort= sort { lc $a cmp lc $b or $a cmp $b } @array;
于 2013-01-22T13:31:51.997 に答える
2

で何をするつもりだったのかわかりませんが、 の内容は決して使用されないとqw言えば十分です。@mass

@array = qw(hello world);

が 2 つの文字列とを@array含むように定義されます。これは次の省略形です。helloworld

@array = ('hello', 'world');

というわけで

@array=qw(@mass);

評価('@mass')結果は、5 文字の単一のリテラル文字列を含む配列@massです。

多分それはあなたが間違っていることです。試してみたらどうですか

@array = map { split /\s+/} @mass;

@mass行のリストです。各行には、単語または文字のみがスペースで区切られています。最後の行が行うことは、各行を次のようにマップすることですsplit /\s+/。これにより、各行が次のようにリストに分割さ'ba ab a G'れ、単語/文字の単一のリストになります('ba', 'ab', 'a', 'G')@array

次に、それらをどのように並べ替えるかが問題です。他の回答も参照してください。

ああ、ファイルを書き出すときは、スペースを元に戻すことを忘れないでください。

print $new (join " ", @mass1);

各行を相互に依存して並べ替えたい場合は、それも簡単です。

$mass1 = join "\n", map { join " ", sort (split /\s+/) }  @mass

これは、「のすべての行について@mass、スペースで分割し、並べ替えてスペースで再び結合する」と読み、結果の配列で結合しnewlineて、ファイルの出力を生成します。

などsortのコンパレータでドロップインできることに注意してください。sort { $a cmp $b }

ファイルが大きすぎる場合は、ループするのが賢明かもしれません:

for my $mass (<$old>) {
    my $sorted_line = join " ", sort (split /\s+/, $mass);
    print $new "$sorted_line\n";
}
于 2013-01-22T13:27:10.830 に答える
1

すべての関数 (ソートなど) で使用される順序が正しいロケールを使用し、それに応じてソートされるように、使用する正しい LOCALE を見つける必要があります。

locales を定義するほとんどの変数を示すこのページを参照し、LANG と LC_ALL を探してください。および LC_COLLATE (どちらがいつ使用されるか正確にはわからないことを認めなければなりません。LC_ALL は他のものよりも優先されるはずなので、すべての LC_* 値を設定するために変更できるものです...テストしてください、ymmv)

おそらく、Unicode ロケールのいずれかを使用する必要があると思います。大文字はアスキーの通常の文字の前にあるため、アスキーはあなたが望むことをしません。

使用できるロケールを確認するには:locale -a

現在設定されているロケールを確認するには: locale(ユーザーおよびシステム全体の値が可能です)

求める順序を得るには、おそらく「utf-8」を含むものが必要です

次に: (たとえば、en_US.UTF-8 が利用可能な場合):

並べ替えで使用する直前に、並べ替えに使用するロケールを定義します。

LC_ALL=en_US.UTF-8

(または、設定する必要のある値は何でも、「locale -a」で示されるように利用可能です)

(必要に応じて、呼び出しの前後に以前の値を保存/復元します)

シェルでは、サブシェルも新しい値を確実に使用するように、再定義した変数に「エクスポート」を設定した方がよいでしょう (例: something | sort: bash ではsort、サブシェルになるため、デフォルト値の LC_* を使用するか、エクスポートした場合は、エクスポートされた値!)

于 2013-01-22T13:59:06.383 に答える