Удаление разделителей из строки даты / времени - PullRequest
3 голосов
/ 21 декабря 2010

Я хочу взять это

Code:
2010-12-21 20:00:00

и сделать его похожим на это:

Code:
20101221200000

Это последнее, что я пробовал

Code:
#!/usr/bin/perl  -w
use strict;
my ($teststring) = '2010-12-21 20:00:00';
my $result =  " ";
print "$teststring\n";
$teststring =~ "/(d\{4\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})(d\{3\})/$result";
        { 
    print "$_\n";
    print "$result\n";
        print "$teststring\n";
    }

Иэто произвело это:

Code:
nathan@debian:~/Desktop$ ./ptest
2010-12-21 20:00:00
Use of uninitialized value $_ in concatenation (.) or string at ./ptest line 8.


2010-12-21 20:00:00
nathan@debian:~/Desktop$

-Спасибо

Ответы [ 4 ]

6 голосов
/ 21 декабря 2010

Во-первых, вот проблема с вашим кодом:

$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
5 голосов
/ 21 декабря 2010

Используйте регулярное выражение для замены всех нецифровых чисел ([^\d] или [\D]) пустой строкой:

$ perl -e '$_ = "2010-12-21 20:00:00"; s/[\D]//g; print $_;'
20101221200000
0 голосов
/ 22 декабря 2010
($result = $teststring) =~ y/0-9//cd;
0 голосов
/ 21 декабря 2010

Разве вы не можете просто удалить что-нибудь, кроме цифр?

s/[^\d]//g 

в формате sed, не можете запомнить perl.

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