Перераспределение метки времени с регулярным выражением Perl - PullRequest
6 голосов
/ 05 января 2012

Я бы хотел перестроить временную метку с помощью регулярного выражения Perl с наименьшим возможным кодом. Исходный формат метки времени выглядит следующим образом:

2011/12/29 20:19:45

Все, что мне нужно сделать, - это преобразовать его так, чтобы год впереди приходил после месяца / даты следующим образом:

12/29/2011 20:19:45

Мне удалось добиться этого с помощью 3 строк кода ниже. Мне просто интересно, есть ли способ сделать это с меньшим количеством кода. В частности, я попытался покончить со средней строкой, сохранив $ 1 в промежуточной переменной и указав $ 1 из первой подстановки непосредственно в регулярном выражении для второй подстановки, но это привело к ошибке: «Использование неинициализированного значения $ 1 в конкатенации ( .) или строка. "

Если не удастся избавиться от второй строки, то может показаться, что до этой строки тоже не доходит?

#my $ts = '2011/12/29 20:19:45'; #input to a subroutine

$ts =~ s/^(\d{4})\///;
my $year = $1;
$ts =~ s/ /\/$year /;

Ответы [ 3 ]

5 голосов
/ 05 января 2012

Вот, пожалуйста,

$ts =~ s|^(\d{4})/(\d{2})/(\d{2})(.+)$|$2/$3/$1$4|;

Обратите внимание, что в приведенном выше выражении ожидаются метки времени, имеющие точно 2 цифры для месяцев и дней и 4 цифры для лет. Но вы можете сделать его еще короче и надежнее:

$ts =~ s|^(\d+)/(\d+)/(\d+)(.+)$|$2/$3/$1$4|;

Этот будет правильно обрабатывать временные метки, такие как 1/12/98 12:34:56.

1 голос
/ 05 января 2012

Используя Обратные ссылки, вы можете получить желаемое форматирование -

[jaypal:~/Temp] echo "2011/12/29 20:19:45" | 
perl -pe 's@([0-9]{4})/([0-9]{2})/([0-9]{2})@$3/$1/$2@'
29/2011/12 20:19:45
0 голосов
/ 19 января 2012

Для более общих манипуляций с отметками времени вы, возможно, захотите совершить поездку туда и обратно через strptime / strftime.В этом случае это просто переупорядочение полей, но для более сложных случаев, таких как преобразование номеров месяцев в имена, потребуется strftime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...