【发布时间】:2018-03-18 22:21:24
【问题描述】:
我试图弄清楚如何在 Perl 中按字母顺序对数组进行排序。这是我在英语中可以正常工作的内容:
# List of countries (kept like this to keep clean, as its re-used in other places)
my $countries = {
'AT' => "íAustria",
'AU' => "Australia",
'BE' => "Belgium",
'BG' => "Bulgaria",
'CA' => "Canada",
'CY' => "Cyprus",
'CZ' => "Czech Republic",
'DK' => "Denmark",
'EN' => "England",
'EE' => "Estonia",
'FI' => "Finland",
'FR' => "France",
'DE' => "Germany",
'GB' => "Great Britain",
'GR' => "Greece",
'HU' => "Hungary",
'IE' => "Ireland",
'IT' => "Italy",
'LV' => "Latvia",
'LT' => "Lithuania",
'LU' => "Luxembourg",
'MT' => "Malta",
'NZ' => "New Zealand",
'NL' => "Netherlands",
'PL' => "Poland",
'PT' => "Portugal",
'RO' => "Romania",
'SK' => "Slovakia",
'SI' => "Slovenia",
'ES' => "Spain",
'SE' => "Sweden",
'CH' => "Switzerland",
'SC' => "Scotland",
'UK' => "United Kingdom",
'US' => "USA",
'TK' => "Turkey",
'NO' => "Norway",
'MX' => "Mexico",
'IL' => "Israel",
'IN' => "India",
'IS' => "Iceland",
'CN' => "China",
'JP' => "Japan",
'VN' => "áVietnamí"
};
# Populate the original loop with "name" and "code"
my @country_loop_orig;
print $IN->header;
foreach (keys %{$countries}) {
push @country_loop_orig, {
name => $countries->{$lang}->{$_},
code => $_
}
}
# sort it alphabetically
my @country_loop = sort { lc($a->{name}) cmp lc($b->{name}) } @country_loop_orig;
这适用于英文版本:
Australia
Austria
Belgium
Bulgaria
Canada
China
Cyprus
Czech Republic
Denmark
England
Estonia
Finland
France
Germany
Great Britain
Greece
Hungary
Iceland
India
Ireland
Israel
Italy
Japan
Latvia
Lithuania
Luxembourg
Malta
Mexico
Netherlands
New Zealand
Norway
Poland
Portugal
Romania
Scotland
Slovakia
Slovenia
Spain
Sweden
Switzerland
Turkey
United Kingdom
USA
Vietnam
...但是当您尝试使用 íéó 等 utf8 执行此操作时,它不起作用:
Australia
Belgium
Bulgaria
Canada
China
Cyprus
Czech Republic
Denmark
England
Estonia
Finland
France
Germany
Great Britain
Greece
Hungary
Iceland
India
Ireland
Israel
Italy
Japan
Latvia
Lithuania
Luxembourg
Malta
Mexico
Netherlands
New Zealand
Norway
Poland
Portugal
Romania
Scotland
Slovakia
Slovenia
Spain
Sweden
Switzerland
Turkey
United Kingdom
USA
áVietnam
íAustria
您是如何做到这一点的?我找到了Sort::Naturally::XS,但无法正常工作。
【问题讨论】:
-
cmp对字符集和编码一无所知。它直接逐个字符(字符串元素)进行比较。 (除了可能在use locale;下,您不应该使用它。)