Perl:标量和字符串匹配(正则表达式)中的赋值
Perl: assignment within scalar and string matching (regex)
我理解以下代码的一般目的(即总结字符串的数字部分,例如 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
在这里没用。表达式已经在标量上下文中。简单 parens 就可以了。
当在标量上下文中计算 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 += ;
}
以下甚至可能就足够了(虽然不等同):
my $currstr = "3S47M";
my $seqlength = 0;
while ($currstr =~ /[0-9]+/g) {
$seqlength += $&;
}
我理解以下代码的一般目的(即总结字符串的数字部分,例如 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
在这里没用。表达式已经在标量上下文中。简单 parens 就可以了。
当在标量上下文中计算 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 += ;
}
以下甚至可能就足够了(虽然不等同):
my $currstr = "3S47M";
my $seqlength = 0;
while ($currstr =~ /[0-9]+/g) {
$seqlength += $&;
}