Perl:标量和字符串匹配中的赋值(正则表达式)
我理解下面这段代码的一般目标(即总结字符串的数字部分,例如对于 currstr="3S47M" 然后 seqlength=50)。
但是有人可以逐行解释我发生了什么吗?
特别是,我很难理解where每回合持有什么价值。更准确地说,我不明白scalar函数的部分("scalar($RLENGTH = length($&), $RSTART = length($`)+1)") ?
里面的赋值RLENGTH和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什么?为什么写作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在标量环境进行评价时,既EXPRX和EXPRY反过来进行评估,并且它导致的结果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 += $&;
}