Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 将字符串中字符的位置转换为“account”;“差距”;(即字符串中的非字母数字字符)_Perl - Fatal编程技术网

Perl 将字符串中字符的位置转换为“account”;“差距”;(即字符串中的非字母数字字符)

Perl 将字符串中字符的位置转换为“account”;“差距”;(即字符串中的非字母数字字符),perl,Perl,简而言之 我有一根像这样的线 ---MNTSDSEEDACNERTALVQSESPSLPSYTRQTDPQHGTTEPKRAGHT--------LARGGVAAPRERD 我有一个位置列表和相应的字符,看起来像这样 position character 10 A 12 N 53 V 54 A position character 13 A 15 N 64

简而言之

我有一根像这样的线

---MNTSDSEEDACNERTALVQSESPSLPSYTRQTDPQHGTTEPKRAGHT--------LARGGVAAPRERD
我有一个位置列表和相应的字符,看起来像这样

position     character
10           A
12           N
53           V 
54           A
position     character
13           A
15           N
64           V 
65           A
my @array = ($string =~ /\w/g);
my $character = $array[$position];
此位置/字符键不考虑字符串中的连字符(-)。例如,在给定的字符串中,第一个字母M位于位置1,N位于位置2,T位于位置3,等等。第二个连字符块前的T位于位置47,该连字符块后的L位于位置48

我需要转换位置和相应字符的列表,以便该位置包含连字符。像这样的

position     character
10           A
12           N
53           V 
54           A
position     character
13           A
15           N
64           V 
65           A
my @array = ($string =~ /\w/g);
my $character = $array[$position];
我认为应该有一个足够简单的方法来做到这一点,但我是相当新的,所以我可能错过了一些明显的,对不起!我是作为Biger脚本的一部分来做这件事的,所以如果有人能用perl来完成这件事,那将是令人惊讶的。提前非常感谢,如果我能澄清任何事情或提供更多信息,请让我知道


我尝试的

首先,我取一个等于位置值的字符子字符串,计算该子字符串中的连字符数,并将连字符数添加到原始位置。对于我列表中的第一个位置/字符,取前10个字符,然后子字符串中有3个连字符,因此10+3=13给出了正确的位置。这适用于我的大多数位置,但当原始位置落在一组连字符内(如位置53和54)时失败

我还尝试通过取出连字符,然后像这样使用原始位置值来抓取角色

position     character
10           A
12           N
53           V 
54           A
position     character
13           A
15           N
64           V 
65           A
my @array = ($string =~ /\w/g);
my $character = $array[$position];

这很有效,但后来我很难用它来转换位置以包含连字符,因为这里有太多匹配字符,无法将我抓取的字符与带连字符的原始字符串匹配,并在其中找到位置(从一开始尝试这可能是一件愚蠢的事).

实际字符似乎不相关。计算非连字符就足够了:

use strict;
use warnings;
use Data::Dumper;
my $s = '---MNTSDSEEDACNERTALVQSESPSLPSYTRQTDPQHGTTEPKRAGHT--------LARGGVAAPRERD';
my @positions = (10,12,53,54);
my @transformed = ();
my $start = 0;

for my $loc(@positions){
    my $dist = $loc - $start;
    while ($dist){
        $dist-- if($s =~ m/[^-]/g);
    }
    my $pos = pos($s);
    push @transformed, $pos;
    $start = $loc;
}
print Dumper \@transformed;
印刷品:

$VAR1 = [
          13,
          15,
          64,
          65
        ];

你是怎么得到这份名单的?也许只是为了解释连字符而改变它?这个字符串实际上是一个氨基酸序列,这个列表是由一个生物信息学程序生成的(基本上,这个列表上的字符是发生有趣事情的氨基酸)。更改列表以考虑连字符是我的目标/我正在寻找的建议。我能够修改此列表以适合我的脚本,它工作得非常好,非常感谢!