漂浮在perl的德国语言环境中不是昏迷的

时间:2016-11-22 09:42:31

标签: linux perl locale setlocale

我在德国语言环境中安装了一台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

1 个答案:

答案 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是一个类似的崩溃。