Perl и представление даты

Nov 28, 2008 21:31

Допустим нам надо представить дату в некотором формате, а функция localtime (или gmtime, кому как нравится) выводит ее не в том формате как нам хотелось бы. В зависимости от контекста она возвращает строку с датой, типа "Fri Nov 28 21:36:29 2008" или массив (точнее список) в котором год указывается как число лет, прошедшее с 1900 года и месяц указывается от нуля.
В принципе исправить этот недостаток не проблема, если использовать промежуточный массив. А если душа требует чтобы его небыло? Как быть тогда?

Первое что приходит на ум - использовать sprintf для формирования даты:

printf("%04i-%02i-%02i %02i:%02i:%02i", (localtime($time))[5,4,3,2,1,0]);

Но год и месяц тут далеко не такие, какие нужны... Второе что приходит на ум - использовать оператор map для изменения года и месяца, но он проходится по всем передающимся в массиве числам и надо строить отдельную конструкцию с подсчетом номера обрататываемого значения и его модификацию.
Но не стоит расстраиваться. Выход есть. Нужно передать оператору map ссылку на список, а вернуть массив!

printf("%04i-%02i-%02i %02i:%02i:%02i\n", ( map{$$_[0] += 1900; $$_[1] += 1; @$_;} [ (localtime())[5,4,3,2,1,0] ] ));

Вуаля!
Тем кто с Perl не знаком, лучше не стараться понять это довольно простое выражение =)
Естественно это решение можно использовать и в других ситуациях.

perl, пробежала мысль

Previous post Next post
Up