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

kur*_*uki 12 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";
Run Code Online (Sandbox Code Playgroud)

Fai*_*Dev 16

你也可以这样做:

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


Zai*_*aid 13

从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
Run Code Online (Sandbox Code Playgroud)

来自perldoc perl5132delta:

非破坏性替代

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

my $old = 'cat';
my $new = $old =~ s/cat/dog/r;
# $old is 'cat' and $new is 'dog'
Run Code Online (Sandbox Code Playgroud)