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

标签 regex perl scalar

我理解以下代码段的总体目标(即对字符串的数字部分求和,例如对于 currstr="3S47M"则 seqlength=50)。

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

特别是,我无法理解 where 在每一回合中持有什么值。更准确地说,我不明白标量函数的部分(“标量($RLENGTH = length($&), $RSTART = length($`)+1)”)?

RLENGTHRSTART 的赋值发生在 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;
}

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

当在标量上下文中计算 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 += $&;
}

关于regex - Perl:标量内的赋值和字符串匹配(正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66145595/

相关文章:

c# - 了解 CultureInvariant 和 IgnoreCase 在 [A-Za-z] 上的后果

java - 在 Java 中按字面替换正则表达式中的字符

r - 如何将数据帧中的向量值与 R 中的常量进行比较?

python:如何识别变量是数组还是标量

javascript - 除非字符串中有括号,否则前瞻不匹配

python - 命名组内的非捕获组

perl - 使用不同的进程在同一个文件中读取和写入

linux - rsync 无法将文件从服务器 A 同步到服务器 B。服务器 B 正在运行 rsync 守护进程

perl - mojolicious morbo 服务器默认缓存吗?