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