Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Yuriy Al. Shirokov ([info]yushi)
@ 2005-06-24 12:18:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Perl'овое: как красиво разобрать строку с датой?
Довелось мне тут писать незамысловатую программку на Perl. В общем и целом, написал и даже заставил работать, но один маленький фрагмент её кода оскорбляет моё эстетическое чувство.

Задачка, собственно, элементарная:

Есть дата в формате: ГГГГ-ММ-ДД часы:минуты:секунды, лежащая, положим, в переменной$row_date . Хочется раскидать её по переменным $sec, $min, $hour, $day, $month, $year.

Я сейчас делаю это так:


($entry_date, $entry_time) = split(/ /,$row_date);
($year, $month, $day) = split(/-/,$entry_date);
($hour, $min, $sec) = split(/:/,$entry_time);


Казалось бы, логично. Но, согласитесь, громоздко и некрасиво. Даже не будучи ни программистом, ни — тем более! — специалистом по Perl'у, я догадываюсь, что то же самое можно сделать гораздо проще.


Соответственно, вопрос уважаемым френдам: как это можно сделать красиво, т.е. в идеале — без дополнительных переменных и в одной строке?


(Добавить комментарий)

;)
[info]asd@lj
2005-06-24 05:19 (ссылка)
my ($year, $month, $day, $hours, $min, $sec) = ($row_date =~ m!(\d{4})-(\d\d)-(\d\d)\s(\d\d):(\d\d):(\d\d)!)

(Ответить) (Ветвь дискуссии)

Re: ;)
[info]mitajchik@lj
2005-06-24 11:01 (ссылка)
Ага, только не \d\d, а лучше \d{1,2}. Там может быть только один символ.

(Ответить) (Уровень выше)

Re: ;)
[info]yushi@lj
2005-06-24 12:20 (ссылка)
Спасибо! Регекспы — сила, да. Надо, наконец, как следует научиться ими пользоваться. =)

(Ответить) (Уровень выше)


[info]yegor_@lj
2005-06-24 05:48 (ссылка)
my ($year, $month, $day, hour, $min, $sec) =~ /(....)-(..)-(..) (..):(..):(..)/ или что-нибудь более гибкое, если надо

(Ответить) (Ветвь дискуссии)


[info]yegor_@lj
2005-06-24 05:49 (ссылка)
т.е., конечно, предыдущий оратор прав:

my ($year, $month, $day, hour, $min, $sec) = ($row_date =~ /(....)-(..)-(..) (..):(..):(..)/)

(Ответить) (Уровень выше)


[info]toshische@lj
2005-06-24 06:24 (ссылка)
Ого, так ты теперь и на машинке^H^H^H^H^H перле вышивать умеешь?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yegor_@lj
2005-06-24 07:47 (ссылка)
учусь.

(Ответить) (Уровень выше)


[info]max_ushakov@lj
2005-06-24 06:02 (ссылка)
Вот тебе и подсказали :-)
Только то, что ты писал -- гораздо понятнее :-)
Хотя на перле я бы сам написал, как в комментах :-)
Парадокс.

(Ответить) (Ветвь дискуссии)


[info]yushi@lj
2005-06-24 12:23 (ссылка)
Мне кажется (в силу низкой квалификации не берусь ни отстаивать, ни даже пытаться сколько-нибудь внятно аргументировать следующее утверждение), что на Perl надо писать, по возможности избегая введения "служебных", т.е. несодержательных, не осмысленных с точки зрения задачи переменных. Именно этим мне прежде всего и не нравилось моё решение.

(Ответить) (Уровень выше)


[info]kstoor@lj
2005-06-24 11:05 (ссылка)
перловка маздай, пехепе рулит ;) ;-Р

list ($year, $month, $day, hour, $min, $sec) = split('[-: ]', $row_date);

(Ответить) (Ветвь дискуссии)


[info]kstoor@lj
2005-06-24 11:19 (ссылка)
слушай, а на перле то же самое не будет работать случайно, а? сплит регекспом делать?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yushi@lj
2005-06-24 12:34 (ссылка)
Не знаю, можно попробовать. Или спросить у присутствующих здесь специалистов.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]toshische@lj
2005-06-24 16:15 (ссылка)
Разумеется будет
my ($year, $month, $day, hour, $min, $sec) = split /\D/, $row_date;

(Ответить) (Уровень выше)


[info]yushi@lj
2005-06-24 12:33 (ссылка)
перловка маздай, пехепе рулит

Хм. То, что я делаю, никак не касается HTML ни в каком виде. А применять php для чего-то помимо WWW — это мазохизм, при всём уважении к. Типа написания веб-сервера на Бэйсике.

Я не считаю Perl идеальным языком программирования. Если бы программирование было моей основной деятельностью и при этом я был бы свободен в выборе инструмента, я использовал бы какой-нибудь функциональный язык вроде Scheme. Однако php по сравнению с Perl, всё-таки, просто игрушка.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kstoor@lj
2005-06-24 14:27 (ссылка)
Юра, не волнуйся, я пошутил ;) Наверно, нормальный язык, раз им люди пользуются. У меня на его синтаксис идиосинкразия -- ну так я не один такой. Пхп пользую только для веба, ни разу ни с какими ограничениями не сталкивался. Имхо, насчет игрушки ты, мягко говоря, преувеличиваешь ;)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]toshische@lj
2005-06-24 16:18 (ссылка)
в php нет аналога use strict; И больших проектах это часто выходит боком. Даже тесты не очень помогают (я делал большие (десятки тысячь строк) проекты и на том и на другом).

(Ответить) (Уровень выше) (Ветвь дискуссии)

Классный юзерпик ;)
[info]kstoor@lj
2005-06-24 16:33 (ссылка)
У меня таких больших не было, только разные движки и подпорки для сайтов. Тысячи на 2-3 строк максимум.

(Ответить) (Уровень выше)


[info]kstoor@lj
2005-06-24 16:39 (ссылка)
Хотя use strict, конечно, и в маленьких скриптах не помешало бы. Хотя мне, например, помогает привычка не юзать глобальные переменные.

(Ответить) (Уровень выше)

Для WWW
[info]comrade_voland@lj
2005-06-24 15:40 (ссылка)
однозначно рулит PHP! Присоединяюсь!

(Ответить) (Уровень выше)