Perl:获取字符串中元素的位置和长度

Perl: Get position and length of element in a string

假设我有一个像这样的字符串:

my $refseq="CCCC-TGA---ATAAAC--TCCAT-GCTCCCCC--------------------AAGC";

我想检测“-”出现的位置和连续“-”的个数。对于上面的示例,我想以“-”位置作为键,扩展长度作为值的散列结束:

%POSLENGTH = (5 => 1, 8 => 3, 14 => 2, 19 => 1, 27 => 20);

注意位置要根据不带“-”的字符串给定。

perlval

中检查 @- 数组
my $refseq = "CCCC-TGA---ATAAAC--TCCAT-GCTCCCCC--------------------AAGC";
my %POSLENGTH;

$POSLENGTH{ $-[0] +1 } = length() while $refseq =~ s/(-+)//;

use Data::Dumper; print Dumper \%POSLENGTH;

输出

$VAR1 = {
      '14' => 2,
      '8' => 3,
      '27' => 20,
      '19' => 1,
      '5' => 1
    };

您可以使用内置的 @-@+ 数组来执行此操作。它们一起保存了元素 0 中最后一次成功模式匹配(以及元素 1 之后的任何捕获)的开始和结束偏移量,因此很明显,最后一次匹配的 length$+[0] - $-[0]. 它们记录在 perldoc perlvar 中的 与正则表达式相关的变量 下。

我在这里使用Data::Dump只是为了显示构建的散列的内容

附带说明一下,我非常怀疑散列是否是此信息的有用结构,因为我无法想象您知道子字符串的起始位置并需要知道其长度的情况。我原以为它更好地表示为一对数组

use strict;
use warnings;

use Data::Dump;

my $refseq="CCCC-TGA---ATAAAC--TCCAT-GCTCCCCC--------------------AAGC";

my %pos_length;

while ( $refseq =~ /-+/g ) {
    my ($pos, $len) = ( $-[0] + 1, $+[0] - $-[0] );
    $pos_length{$pos} = $len;
}

dd \%pos_length;

输出

{ 5 => 1, 9 => 3, 18 => 2, 25 => 1, 34 => 20 }