存储正则表达式导致新变量

时间:2011-11-21 00:48:47

标签: regex perl

以下程序是重新排列字符串。对于第8行,我试图将正则表达式的结果存储到新变量$ newdate中,但是当第9行打印$ newdate时,它只显示1.如何更改我的代码以便$ newdate将存储正则表达式操作的$ date值?

1 #!/usr/bin/perl
2 
3 # This program changes the date format from mm/dd/yyyy to yyyy,mm,dd
4 
5 $date = '21/11/2011';
6 print "Current: $date\n";
7
8 $newdate = $date =~ s/(..)\/(..)\/(....)/$3,$2,$1/;
9 print "New: $newdate\n";

4 个答案:

答案 0 :(得分:16)

你也可以这样做:

my $date = '21/11/2011';
print "Current: $date\n";
my $newdate;
($newdate = $date) =~ s/(..)\/(..)\/(....)/$3,$2,$1/;
print $newdate;

答案 1 :(得分:12)

从Perl 5.13.2开始,可以通过s///r修饰符指定非破坏性替换,因此会分配替换后字符串的副本而不是匹配数。它还可以防止修改原始字符串,这意味着两个赋值具有相同的行为:

( my $new_date = $date ) =~ s<(..)/(..)/(....)><$3,$2,$1>; # Pre-5.13.2

  my $new_date = $date =~ s<(..)/(..)/(....)><$3,$2,$1>r;  # Post-5.13.2

来自perldoc perl5132delta

  

非破坏性替代

     

替换运算符现在支持复制的/r选项   输入变量,在副本上执行替换并返回   结果。原件保持不变。

my $old = 'cat';
my $new = $old =~ s/cat/dog/r;
# $old is 'cat' and $new is 'dog'

答案 2 :(得分:4)

=~运算符将返回替换时所做的更改次数,除非您在全局执行,否则它将始终返回1或0.此外,替换是在适当的位置进行的,因此,如果您的目标不是修改$date,你不想替换。

尝试:

$date =~ m/(..)\/(..)\/(....)/;
$newdate = "$3,$2,$1";

答案 3 :(得分:1)

本着TIMTOWTDI的精神:

my $date = '21/11/2011';

my $newdate = join ",", reverse split m#/#, $date;

这恰好起作用,因为你想要数字的反向顺序。你也可以这样做:

my $newdate = join ",", ( split m#/#, $date )[2,1,0];

另一种方式:

my $newdate = join ",", reverse ( $date =~ /(\d+)/g );

另外:Why use strict and warnings?