次のデータは、ロケールのソート順に従ってソートする必要があります。
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 $/ = undef
。perl
ファイル全体を配列として読み込みます。@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 $/ = undef
Perlは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_COLLATE
(LC_ALL
存在しない場合)、デフォルトで使用されるため、sort
影響を受けます。cmp
現在LC_COLLATE
の値を取得できます。
$ perl -MPOSIX=setlocale -le 'print setlocale(LC_COLLATE)'
en_US.UTF-8
答え2
ファイルを配列として読み取る正しい方法は次のとおりです。
$ perl -e 'print sort <>;' < data
設定レコード区切り記号の入力undef はファイル全体をスカラーに入れます。その後、単一値の配列をソートすることはあまり意味がありません。
アレイモードでは、すでにファイル全体を一度に読み取ることができます。そうすれば、ソートは意味があります。
$ perl -e 'use locale; print sort <>;' < data
peach
péché
pêche
sin
Uber
Über
war
wär
wird
ここにENVIRONMENT
ありますLANG=en_US.UTF-8
。このuse locale;
ステートメントがない場合は、デフォルトのLC_ALL=C
ソートスキームを使用します。
もっと知りたい場合: