Perlを使用してロケールに基づいてソート

Perlを使用してロケールに基づいてソート

次のデータは、ロケールのソート順に従ってソートする必要があります。

wird
sin
wär
pêche
war
Über
Uber
péché
peach

使用するのに問題ありません。sort

$ sort < data
peach
pêche
péché
sin
Uber
Über
war
wär
wird

ロケールを尊重する

$ LC_ALL=C sort < data
Uber
peach
péché
pêche
sin
war
wird
wär
Über

ロケールはありません。

これでこれを試みますperlが失敗します。

$ perl -e 'local $/ = undef; print sort <>;' < data
Über
pêche
war
péché
sin
Uber
peach
wär
wird

結果は、ソートの最初の出力、または2番目の出力です。

Ubuntu 12.04 LTSの実行

ベストアンサー1

問題はですlocal $/ = undefperlファイル全体を配列として読み込みます。@ARGVつまり、ファイルには要素が1つしか含まれていないため、sort並べ替えることはできません。出力は開始データと同じでなければなりません(次も使用しますUbuntu 12.04 LTS, perl version 5.14.2

$ perl -le 'local $/ = undef;print ++$i for <>' < cat
1

$ perl -le 'print ++$i for <>' < cat
1
2
3
4
5
6
7
8
9

削除すると、local $/ = undefPerlはsortシェルと同じ出力を生成しますsort with LC_ALL=C

$ perl -e 'print sort <>' < data
Uber
peach
péché
pêche
sin
war
wird
wär
Über

ノート

そうでない場合、use locale現在のperlロケールは無視されます。 Perl比較演算子が("lt", "le", "cmp", "ge", and "gt")使用されLC_COLLATELC_ALL存在しない場合)、デフォルトで使用されるため、sort影響を受けます。cmp

現在LC_COLLATEの値を取得できます。

$ perl -MPOSIX=setlocale -le 'print setlocale(LC_COLLATE)'
en_US.UTF-8

おすすめ記事