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

Sri*_*san 2 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
Run Code Online (Sandbox Code Playgroud)

cev*_*ing 7

您的问题涉及两个不同的主题.以下假定您取消设置LC_ALL并设置LC_NUMERIC,因为LC_ALL覆盖LC_NUMERIC.

 $ unset LC_ALL
 $ export LC_NUMERIC=de_DE.UTF-8
Run Code Online (Sandbox Code Playgroud)

编程语言的本地化

$ perl -e 'printf "%f\n", 2,5'
2.000000
Run Code Online (Sandbox Code Playgroud)

您的语言环境定义了数字的打印方式.语言环境不会改变编程语言的语法.Perl代码对区域设置的更改无动于衷.如果不是,则必须为每种语言修改每个程序.这将是真正的痛苦,例如在Excel中.

程序输入和输出的本地化

$ perl -e 'printf "%f\n", "2,5"'
2.000000
Run Code Online (Sandbox Code Playgroud)

这可以被视为一个错误.Bash做对了:

$ printf '%f\n' 2,5
2,500000
Run Code Online (Sandbox Code Playgroud)

为了使用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
Run Code Online (Sandbox Code Playgroud)

即使我setlocale没有设置我使用,LC_ALL我在Perl 5.18.2中得到了错误的结果.这很坚果.

但Perl在本地化方面有着悠久的笨拙传统.源文件中的Latin1是一个类似的崩溃.