我想接受这个
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$
-Thanks
答案 0 :(得分: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}
表示匹配字符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
答案 1 :(得分:5)
使用正则表达式将所有非数字([^\d]
或[\D]
)替换为空字符串:
$ perl -e '$_ = "2010-12-21 20:00:00"; s/[\D]//g; print $_;'
20101221200000
答案 2 :(得分:0)
你能不能删除任何不是数字的东西?
s/[^\d]//g
答案 3 :(得分:0)
($result = $teststring) =~ y/0-9//cd;