我在德国语言环境中安装了一台linux机器。当我在perl中打印float / double时,我希望它以昏迷分开打印而不是点分开。但它没有发生。有什么想法吗?
[root@IDCDVAM886 ~]# uname -a
Linux IDCDVAM886 3.10.0-327.el7.x86_64 #1 SMP Thu Oct 29 17:29:29 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@IDCDVAM886 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)
[root@IDCDVAM886 ~]# locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=de_DE.UTF-8
[root@IDCDVAM886 ~]# echo $LC_ALL
de_DE.UTF-8
[root@IDCDVAM886 ~]# echo $LC_NUMERIC
de_DE.UTF-8
[root@IDCDVAM886 ~]# cat my.pl
#!/usr/bin/perl
use locale;
print "LC_NUMERIC = $ENV{LC_NUMERIC}\n";
print 5/2 ;
print "\n";
my $val = 2,5;
print "$val\n";
[root@IDCDVAM886 ~]# ./my.pl
LC_NUMERIC = de_DE.UTF-8
2.5
2
答案 0 :(得分:7)
您的问题涉及两个不同的主题。以下假设您取消设置LC_ALL
并设置LC_NUMERIC
,因为LC_ALL
会覆盖LC_NUMERIC
。
$ unset LC_ALL
$ export LC_NUMERIC=de_DE.UTF-8
编程语言的本地化
$ perl -e 'printf "%f\n", 2,5' 2.000000
您的语言环境定义了数字的打印方式。语言环境不会改变编程语言的语法。 Perl代码对区域设置的更改无动于衷。如果不是,则必须为每种语言修改每个程序。这将是真正的痛苦,例如在Excel中。
程序输入和输出的本地化
$ perl -e 'printf "%f\n", "2,5"' 2.000000
这可以被视为一个错误。 Bash做对了:
$ printf '%f\n' 2,5
2,500000
为了使用Perl 5.18.2做到正确,我必须这样做:
$ export LC_ALL=de_DE.UTF-8
$ perl -e 'use locale; use POSIX qw(locale_h); setlocale(LC_NUMERIC, "de_DE"); printf "%f\n", "2,5"'
2,500000
即使我在没有设置setlocale
的情况下使用LC_ALL
,我在Perl 5.18.2中也会得到错误的结果。这很疯狂。
但Perl在本地化方面有着悠久的笨拙传统。源文件中的Latin1是一个类似的崩溃。