【问题标题】:Storing regex result in a new variable存储正则表达式会产生一个新变量
【发布时间】:2012-01-02 14:48:16
【问题描述】:

下面的程序是重新排列一个字符串。对于第 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";

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    你也可以这样做:

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

    【讨论】:

    • 谢谢 - 这就是我所追求的。
    【解决方案2】:

    从 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'
    

    【讨论】:

      【解决方案3】:

      =~ 运算符将返回进行替换时所做的更改次数,除非您在全局范围内执行此操作,否则它将始终返回 1 或 0。此外,替换是就地进行的,所以如果您的目标是不要修改$date,你不想替换。

      试试:

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

      【讨论】:

        【解决方案4】:

        本着 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?

        【讨论】:

          猜你喜欢
          • 2020-06-23
          • 2013-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多