Во-первых, вот проблема с вашим кодом:
$teststring =~ "/(d\{4\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})/$result";
Вы хотите использовать =~
с оператором подстановки s///
.То есть правая часть не должна быть простой строкой, но s/pattern/replacement/
.
В части шаблона \d
будет обозначать цифру.Однако \d
включает в себя все виды символов, которые находятся в классе цифр Unicode, поэтому безопаснее использовать класс символов [0-9]
, если это то, с чем вы хотите сравнить.[0-9]{4}
будет означать совпадение символов от 0
до 9
четыре раза.Обратите внимание, что вы не должны избегать фигурных скобок {
и }
.
Скобки (
и )
определяют группы захвата.В заменяющей части вы хотите сохранить материал, который вы захватили, и игнорировать материал, который вы не сделали.
Кроме того, я предполагаю, что эти временные метки появляются в другом входе, и вы не хотите случайно заменить материалВы не хотели (слепо удаляя все не-цифры).
Ниже я использую модификатор /x
для оператора s///
, чтобы я мог более четко отформатировать pattern
, используя пробел.
#!/usr/bin/perl
use strict; use warnings;
while ( <DATA> ) {
s{
^
([0-9]{4})-
([0-9]{2})-
([0-9]{2})[ ]
([0-9]{2}):
([0-9]{2}):
([0-9]{2})
}{$1$2$3$4$5$6}x;
print;
}
__DATA__
Code:
2010-12-21 20:00:00
или использование именованных групп захвата, представленных в 5.10
, может сделать все это немного более читабельным:
#!/usr/bin/perl
use 5.010;
while ( <DATA> ) {
s{
^
( ?<year> [0-9]{4} ) -
( ?<month> [0-9]{2} ) -
( ?<day> [0-9]{2} ) [ ]
( ?<hour> [0-9]{2} ) :
( ?<min> [0-9]{2} ) :
( ?<sec> [0-9]{2} )
}
{
local $";
"@+{qw(year month day hour min sec)}"
}ex;
print;
}
__DATA__
Code:
2010-12-21 20:00:00