alexkuklin: (Default)
alexkuklin ([personal profile] alexkuklin) wrote2005-11-27 08:43 pm

Вопрос по perl про переключение локалей

Общая постановка задачи: Как в процессе работы перлового скрипта переключиться с однойдругую на дргугую.


Задача для частного случая: Два раза напечатать дату. Один раз в локале из которой скрипт бвторойщен, втоврой раз
в локале en_US (В системе такая локаль есть)

Пробуем решить:

use strict;
use POSIX;

print strftime("%B %d, %Y",0, 0, 0, 30, 10, 79)."\n";

setlocale('LC_ALL','en_US');
$ENV{'LANGUAGE'} = 'en_US';
$ENV{'LANG'} = 'en_US';
$ENV{'LC_ALL'} = 'en_US';

print strftime("%B %d, %Y",0, 0, 0, 30, 10, 79)."\n"; 


Решение не верное. Оба раза дата выводится по русски...

Где ошибка, куда копать?

[identity profile] solya.livejournal.com 2005-11-27 05:51 pm (UTC)(link)
setlocale ('LC_TIME', 'en_US')

а не так?

[identity profile] timurv.livejournal.com 2005-11-27 06:01 pm (UTC)(link)
# This functionality not usable prior to Perl 5.004
require 5.004;

use warnings;
use strict;

# Import locale-handling tool set from POSIX module.
# This example uses: setlocale -- the function call
# LC_CTYPE -- explained below
use POSIX qw(locale_h strftime);

print strftime("%B %d, %Y",0, 0, 0, 30, 10, 79)."\n";

setlocale(LC_ALL, "en_US");

print strftime("%B %d, %Y",0, 0, 0, 30, 10, 79)."\n";


----
$ cat /etc/fedora-release
Fedora Core release 4 (Stentz)
----
$ perl -v

This is perl, v5.8.6 built for i386-linux-thread-multi

Кавычки в общем =)

[identity profile] timurv.livejournal.com 2005-11-27 06:02 pm (UTC)(link)
Не нада кавычек вокруг LC_ALL в setlocale
ext_613079: Default userpic (Default)

Re: Кавычки в общем =)

[identity profile] shaplov.livejournal.com 2005-11-27 06:23 pm (UTC)(link)
Ой... а пачему?
LC_ALL это что?
vitus_wagner: My photo 2005 (Default)

Re: Кавычки в общем =)

[personal profile] vitus_wagner 2005-11-27 06:36 pm (UTC)(link)
Процедура такая. Определенная в модуле POSIX. Вообще константы в Perl обычно такие процедуры, возвращающие константное значение.
vitus_wagner: My photo 2005 (Default)

Re: Кавычки в общем =)

[personal profile] vitus_wagner 2005-11-27 06:44 pm (UTC)(link)
Правило первое user never reads documentation

Там же написано про setlocale буквально следующее:

Modifies and queries
program’s locale. The following examples assume
        use POSIX qw(setlocale LC_ALL LC_CTYPE);


has been issued.



The following will set the traditional
UNIX system locale behavior (the second
argument "C").


        $loc = setlocale( LC_ALL, "C" );



Правило второе - если у юзера не получается удалить файл в /tmp он переустанавливает систему.
НИКОГДА НЕ ПЕРЕСТАВЛЯЙТЕ LC_ALL. Надо время - значит это LC_TIME. Надо верхний/нижний регистр - значит LC_CTYPE. А то огребете грабли с LC_NUMERIC.
ext_613079: Default userpic (Default)

[identity profile] shaplov.livejournal.com 2005-11-27 09:55 pm (UTC)(link)
Зенаешь, тогда я не понимаю почему на ct-net'е даты получаются русские...
Я внимательно посмотрел, там все без кавычек...
Вообщем буду дальше копать.. :-/