微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Perl:标量和字符串匹配中的赋值正则表达式

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

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

特别是,我无法理解每回合 library(dplyr) df1 %>% group_by(block) %>% mutate(block_ts = seq(0,length.out = n(),by = 0.001)) 所持有的值。更准确地说,我不明白 where 函数的部分 ("scalar($RLENGTH = length($&),$RSTART = length($`)+1)") ?

scalarRLENGTH 的赋值发生在 RSTART 内是否正确?

为什么在 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行不通?

解决方法

$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 += $&;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。