В вашем заявлении о проблеме сказано, что вы хотите повернуть:
2018-09-19
в
2018-09-19 00:00:00.00
Тем не менее, ваш код:
s/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))\[/$1[00:00:00.00]][/
Используя /x
, мы можем написать это более разборчиво, как:
s/
(
[12]\d{3} # year
- # hyphen
( 0[1-9] | 1[0-2] ) # month (saved as $2)
- # hyphen
( 0[1-9] | [12]\d | 3[01] ) # day (saved as $3)
) # save this as $1
\[ # square bracket
/$1[00:00:00.00]][/x
Из этого ясно, что 2018-09-19
не совпадает, поскольку не заканчивается квадратной скобкой.
Значение замены:
$1[00:00:00.00]][
Это (пытается) сказать:
- индекс поиска
00:00:00.00
в массиве @1
и подставляемое значение
- приложение
][
Однако это неверный perl и не то, что вы хотели.
Происходит следующее: вместо $x
+ [y]
(скаляр, за которым следует строковое значение), perl видит $x[y]
(значение из массива). Чтобы предотвратить это, используйте скобки (${x}[y]
) или избегайте скобок ($x\[y]
). Это приводит к:
${1}[00:00:00.00]][
, что по-прежнему не соответствует требованию проблемы, поскольку нули заключены в квадратные скобки.
Чтобы получить то, что, как вы говорите, хотите, удалите \[
с конца поисковой части и удалите ненужные скобки с запасной части:
s/
(
[12]\d{3}
- ( 0[1-9] | 1[0-2] )
- ( 0[1-9] | [12]\d | 3[01] )
)
# no bracket here
/$1 00:00:00.00/x; # no brackets here
Обратите внимание, что в вашем коде есть еще одна ошибка, заключающаяся в том, что конечный print
должен быть отделен от s///
точкой с запятой.