繁体   English   中英

Perl:标量和字符串匹配(正则表达式)内的赋值

[英]Perl: assignment within scalar and string matching (regex)

我理解以下代码的一般目的(即总结字符串的数字部分,例如对于 currstr="3S47M" 然后 seqlength=50)。

但是有人可以逐行解释我发生了什么吗?

特别是where我很难理解每回合持有什么价值。 更准确地说,我不理解scalar function ("scalar($RLENGTH = length($&), $RSTART = length($`)+1)") 的部分?

RLENGTHRSTART的分配发生在scalar内部是否正确?

为什么在scalar中使用逗号分隔的赋值? 这是什么意思? 那么它的评估结果是什么?

如果有人可以提供帮助,我将非常感激!

谢谢

埃里卡

  my $seqlength=0; 
  my $currstr="3S47M";

  my $where = $currstr =~ /[0-9]+[M|D|N|X|=|S|H|N]/
    ? scalar($RLENGTH = length($&), $RSTART = length($`)+1) : 0;
  while ($where > 0) {
    $seqlength += substr($currstr, ($where)-1, $RLENGTH - 1) + 0;
    $currstr = substr($currstr, ($where + $RLENGTH)-1);
    $where = $currstr =~ /[0-9]+[M|D|N|X|=|S|H|N]/
      ? scalar($RLENGTH = length($&), $RSTART = length($`)+1) : 0;
  }

编辑: RSTART的目的是什么? 为什么写scalar($RLENGTH = length($&)行不通?

$where = $currstr =~ /[0-9]+[M|D|N|X|=|S|H|N]/
  ? scalar($RLENGTH = length($&), $RSTART = length($`)+1) : 0;

相当于

if ($currstr =~ /[0-9]+[M|D|N|X|=|S|H|N]/) {
   $where = scalar($RLENGTH = length($&), $RSTART = length($`)+1);
} else {
   $where =  0;
}

scalar在这里没用。 表达式已经在标量上下文中。 简单的括号就可以了。

EXPRX, EXPRY在标量上下文中求值时, EXPRXEXPRY依次求值,结果为EXPRY 因此,上述等价于

if ($currstr =~ /[0-9]+[M|D|N|X|=|S|H|N]/) {
   $RLENGTH = length($&);
   $RSTART = length($`) + 1;
   $where = $RSTART;
} else {
   $where =  0;
}

请注意, [M|D|N|X|=|S|H|N]是一种奇怪的写法[MDX=SHN|] 重复的N| 被忽略。 事实上, | 可能根本不应该在那里。 我怀疑它应该是[DHMNSX=]


如果我理解正确,代码可以写成如下:

my $currstr = "3S47M";

my $seqlength = 0; 
while ($currstr =~ /([0-9]+)[DHMNSX=]/g) {
   $seqlength += $1;
}

以下甚至可能就足够了(尽管不等效):

my $currstr = "3S47M";

my $seqlength = 0; 
while ($currstr =~ /[0-9]+/g) {
   $seqlength += $&;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM