以下数据需要按照语言环境排序顺序进行排序:
wird
sin
wär
pêche
war
Über
Uber
péché
peach
Run Code Online (Sandbox Code Playgroud)
使用也没有问题 sort
$ sort < data
peach
pêche
péché
sin
Uber
Über
war
wär
wird
Run Code Online (Sandbox Code Playgroud)
尊重当地,以及
$ LC_ALL=C sort < data
Uber
peach
péché
pêche
sin
war
wird
wär
Über
Run Code Online (Sandbox Code Playgroud)
没有语言环境。
现在我尝试使用perl,但我失败了:
$ perl -e 'local $/ = undef; print sort <>;' < data
Über
pêche
war
péché
sin
Uber
peach
wär
wird
Run Code Online (Sandbox Code Playgroud)
结果要么是排序的第一个输出,要么是第二个。
运行 Ubuntu 12.04 LTS
问题是local $/ = undef。它导致perl将整个文件读入@ARGV数组,这意味着它只包含一个元素,因此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
Run Code Online (Sandbox Code Playgroud)
如果删除local $/ = undef,perlsort将与 shell 产生相同的输出sort with LC_ALL=C:
$ perl -e 'print sort <>' < data
Uber
peach
péché
pêche
sin
war
wird
wär
Über
Run Code Online (Sandbox Code Playgroud)
笔记
如果没有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
Run Code Online (Sandbox Code Playgroud)
因为将文件读入数组的正确方法是:
$ perl -e 'print sort <>;' < data
Run Code Online (Sandbox Code Playgroud)
将输入记录分隔符设置为 undef 只是将整个文件放入单个标量中。那么对单个值数组进行排序意义不大。
阵列模式已经在一次读取您的整个文件。那么排序将是有意义的:
$ perl -e 'use locale; print sort <>;' < data
peach
péché
pêche
sin
Uber
Über
war
wär
wird
Run Code Online (Sandbox Code Playgroud)
在这里,我ENVIRONMENT有LANG=en_US.UTF-8。如果没有该use locale;语句,您将使用默认LC_ALL=C排序方案。
如果您想了解更多: