Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > конвертировать русские даты в цифровой формат


Автор: Suppir 15.7.2010, 13:09
Привет!

Есть строки вида "3 января 2010 г.", "12 мая 2010 года", 

Строки нужно преобразовать в "03.01.2010", "12.05.2010" 

Есть следующая страшная функция:

sub convertDate{
    $a = $_[0];
    $a =~ s/(\d) января (\d)/$1.01.$2/;     
    $a =~ s/(\d) февраля (\d)/$1.02.$2/;    
    $a =~ s/(\d) марта (\d)/$1.03.$2/;      
    $a =~ s/(\d) апреля (\d)/$1.04.$2/;      
    $a =~ s/(\d) мая (\d)/$1.05.$2/;        
    $a =~ s/(\d) июня (\d)/$1.06.$2/;       
    $a =~ s/(\d) июля (\d)/$1.07.$2/;       
    $a =~ s/(\d) августа (\d)/$1.08.$2/;    
    $a =~ s/(\d) сентября (\d)/$1.09.$2/;   
    $a =~ s/(\d) октября (\d)/$1.10.$2/;    
    $a =~ s/(\d) ноября (\d)/$1.11.$2/;     
    $a =~ s/(\d) декабря (\d)/$1.12.$2/;    
    $a = "0$a" if $a=~ /^\d\./;            
    $a =~ s/(\d{4})\s*г?о?д?а?\./$1/;
    return $a
}

Как записать более элегантно?


Автор: arto 15.7.2010, 14:24
через хэш?

Автор: sir_nuf_nuf 15.7.2010, 15:03
Код

my %mons = map {qw(
    декабря января февраля
    апреля марта мая
    июня июля августа
    сентября октябра ноября
)[$_ - 1] => $_} (1 .. 12);

sub blabla {
    my $dt = shift;
    $dt =~ s/(\d)\s+(\S+)\s+(\d)/"$1." . ($mons{$2} || $2) . ".$3"/ie;     
    return $dt;
}

print blabla('12 сентября 1997');

Автор: Suppir 16.7.2010, 11:38
sir_nuf_nuf,  то что нужно, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)