2010-12-21 47 views
3

我想借此從日期/時間刪除分隔符串

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: 
[email protected]:~/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 
[email protected]:~/Desktop$ 

- 感謝

回答

6

首先,這裏是你的代碼的問題:

$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}將意味着匹配字符09四次。請注意,您不應該跳過大括號{}

圓括號()定義捕獲組。在替換部分,你想保留你捕獲的東西,並忽略你沒有的東西。此外,我假設這些時間戳發生在其他輸入中,並且您不希望意外更換不想要的東西(通過盲目地刪除所有非數字)。

下面,我使用運算符的/x修飾符,所以我可以使用空格更清楚地格式化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 
0

難道你不能刪除任何不是數字的東西嗎?

s/[^\d]//g 

以sed格式,不記得perl。

+0

的Perl是相同 – ysth 2010-12-22 10:02:44

5

使用正則表達式與空字符串替換所有非數字([^\d][\D]):

$ perl -e '$_ = "2010-12-21 20:00:00"; s/[\D]//g; print $_;' 
20101221200000 
+0

是啊,這樣的。我又在寫R風格。 – 2010-12-21 14:17:32

0
($result = $teststring) =~ y/0-9//cd;