当我尝试解析时,试图修改只读值

  • 本文关键字:修改 只读 regex perl
  • 更新时间 :
  • 英文 :


我得到错误:试图修改只读值

#!/usr/bin/perl
$s = '10/25/95';
print "$s = $s";
($1, $2, $3) = ($s =~ /(d{1,2})/(d{1,2})/(d{2,4})/); # getting error here
print "$1 $2 $3 n";
print 'Done..."

不能给$1$2等赋值,因为它们是只读的。

你想要的是

my $s = '10/25/95';
print "$s = $s";
print "$1 $2 $3 n" if $s =~ /(d{1,2})/(d{1,2})/(d{2,4})/;

if (my ($x, $y, $z) = $s =~ /(d{1,2})/(d{1,2})/(d{2,4})/ ) {
  print "$x $y $z n";
}

您似乎对如何初始化$1, $2等有误解。

观察这个文档-提取匹配:

提取匹配

分组元字符()还有另一个完全不同的功能:它们允许提取字符串中匹配的部分。这对于找出匹配的内容和一般的文本处理非常有用。对于每个分组,内部匹配的部分放入特殊变量$1, $2等。它们可以像普通变量一样使用:

       # extract hours, minutes, seconds
       if ($time =~ /(dd):(dd):(dd)/) {    # match hh:mm:ss format
           $hours = $1;
           $minutes = $2;
           $seconds = $3;
       }

阅读更多…

可以看到,如果模式匹配,regex引擎会自动初始化捕获组变量。重要的一件事是,在尝试使用捕获的变量之前,使用if来验证您的regex是否实际匹配。

另外,确保在每个perl脚本中包含use strict;use warnings;。这是你要成为一个更好的Perl程序员所能做的第一件事。

以下是我将如何根据这些修复重新工作你的脚本:

#!/usr/bin/perl
use strict;
use warnings;
my $s = '10/25/95';
print "$s = $sn";
if ($s =~ m{(d{1,2})/(d{1,2})/(d{2,4})}) {
    print "$1 $2 $3 n";
} else {
    warn "Unable to match pattern";
}
print 'Done...';

输出:

$s = 10/25/95
10 25 95 
Done...

最新更新