Как искать в массиве Perl строку, которая меняет каждую итерацию - PullRequest
0 голосов
/ 25 февраля 2019

Я посмотрел документацию и знаю, как искать в массиве строку, печатать местоположение строки и т. Д. Но моя проблема в том, что моя строка меняется для каждой итерации.Моя цель - найти строку в первой строке массива, сохранить ее местоположение, затем найти другую строку в первом столбце массива и сохранить это местоположение (предоставив мне строку, расположение столбца в массиве).Вот код «идеи», которую я хочу выполнить:

use strict;
use warnings;
my $subseq1 = 'MNIDDKL';
my $subseq2 = 'GLFLKCGGIDEMQSS';
my $line;
my @array;
my @arr;
while($line = <MATFILE>) #Load the array
{
    $line =~ /^$/ and die "Blank line detected at $.\n";
    $line =~ /^#/ and next;
    push @array, $line; #adds each line to the array
};
close MATFILE;

#Join then split
my $joined = join('', @array);
my @rep = $joined =~/./g;
@rep = split(' ', $joined);

#Need to split into row, column format:
while (@rep)
{
    push (@arr, [splice(@rep, 0, 24)]);
}
my ($len1, $len2) = map length, $subseq1, $subseq2;
my @subseq1 = $subseq1 =~ /./g;
my @subseq2 = $subseq2 =~ /./g;
for my $x (0..$len2) #Number of rows
{
    for my $y (0..$len1) #Number of columns
    {
        if ($subseq1[$y] == $arr[0][$_]) #Does not work 
        {
        my $subcol = $_; #column from the sub matrix
        }

    if ($subseq2[$x] == $arr[$_][0]) #Does not work
        {
        my $subrow = $_; #row from pam matrix
        }
    }
}

Я знаю, что могу использовать List :: MoreUtils 'first_index', чтобы найти первое местоположение моей строки, но я не уверен, какчтобы сделать это при изменении моей строки.

В целом, я ищу, чтобы найти символ в каждой строке (например, 'A' и 'R'), найти один в первой строке массива, найтидругой в первом столбце массива, и связать местоположение для него.Мы ценим любую помощь!

Вот матрица, к которой я хочу получить доступ:

#
# PAM 250 substitution matrix, scale = ln(2)/3 = 0.231049
#
# Expected score = -0.844, Entropy = 0.354 bits
#
# Lowest score = -8, Highest score = 17
#
   A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  B  Z  X  *
A  2 -2  0  0 -2  0  0  1 -1 -1 -2 -1 -1 -3  1  1  1 -6 -3  0  0  0  0 -8
R -2  6  0 -1 -4  1 -1 -3  2 -2 -3  3  0 -4  0  0 -1  2 -4 -2 -1  0 -1 -8
N  0  0  2  2 -4  1  1  0  2 -2 -3  1 -2 -3  0  1  0 -4 -2 -2  2  1  0 -8
D  0 -1  2  4 -5  2  3  1  1 -2 -4  0 -3 -6 -1  0  0 -7 -4 -2  3  3 -1 -8
C -2 -4 -4 -5 12 -5 -5 -3 -3 -2 -6 -5 -5 -4 -3  0 -2 -8  0 -2 -4 -5 -3 -8
Q  0  1  1  2 -5  4  2 -1  3 -2 -2  1 -1 -5  0 -1 -1 -5 -4 -2  1  3 -1 -8
E  0 -1  1  3 -5  2  4  0  1 -2 -3  0 -2 -5 -1  0  0 -7 -4 -2  3  3 -1 -8
G  1 -3  0  1 -3 -1  0  5 -2 -3 -4 -2 -3 -5  0  1  0 -7 -5 -1  0  0 -1 -8
H -1  2  2  1 -3  3  1 -2  6 -2 -2  0 -2 -2  0 -1 -1 -3  0 -2  1  2 -1 -8
I -1 -2 -2 -2 -2 -2 -2 -3 -2  5  2 -2  2  1 -2 -1  0 -5 -1  4 -2 -2 -1 -8
L -2 -3 -3 -4 -6 -2 -3 -4 -2  2  6 -3  4  2 -3 -3 -2 -2 -1  2 -3 -3 -1 -8
K -1  3  1  0 -5  1  0 -2  0 -2 -3  5  0 -5 -1  0  0 -3 -4 -2  1  0 -1 -8
M -1  0 -2 -3 -5 -1 -2 -3 -2  2  4  0  6  0 -2 -2 -1 -4 -2  2 -2 -2 -1 -8
F -3 -4 -3 -6 -4 -5 -5 -5 -2  1  2 -5  0  9 -5 -3 -3  0  7 -1 -4 -5 -2 -8
P  1  0  0 -1 -3  0 -1  0  0 -2 -3 -1 -2 -5  6  1  0 -6 -5 -1 -1  0 -1 -8
S  1  0  1  0  0 -1  0  1 -1 -1 -3  0 -2 -3  1  2  1 -2 -3 -1  0  0  0 -8
T  1 -1  0  0 -2 -1  0  0 -1  0 -2  0 -1 -3  0  1  3 -5 -3  0  0 -1  0 -8
W -6  2 -4 -7 -8 -5 -7 -7 -3 -5 -2 -3 -4  0 -6 -2 -5 17  0 -6 -5 -6 -4 -8
Y -3 -4 -2 -4  0 -4 -4 -5  0 -1 -1 -4 -2  7 -5 -3 -3  0 10 -2 -3 -4 -2 -8
V  0 -2 -2 -2 -2 -2 -2 -1 -2  4  2 -2  2 -1 -1 -1  0 -6 -2  4 -2 -2 -1 -8
B  0 -1  2  3 -4  1  3  0  1 -2 -3  1 -2 -4 -1  0  0 -5 -3 -2  3  2 -1 -8
Z  0  0  1  3 -5  3  3  0  2 -2 -3  0 -2 -5  0  0 -1 -6 -4 -2  2  3 -1 -8
X  0 -1  0 -1 -3 -1 -1 -1 -1 -1 -1 -1 -1 -2 -1  0  0 -4 -2 -1 -1 -1 -1 -8
* -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8  1

Я буду получать доступ к этим значениям и использовать их для вычисления оценки сходства последовательностей.

1 Ответ

0 голосов
/ 25 февраля 2019
my %score_lookup;
{
   my $found_header = 0;
   my @col_ids;
   while (<>) {
      next if /^#/;

      if ($found_header) {
         my ($row_id, @fields) = split;
         for my $i (0..$#fields) {
            my $col_id = $col_ids[$i];
            my $score = $fields[$i];
            $score_lookup{ $row_id . $col_id } = $score;
         }
      } else {
         $found_header = 1;
         @col_ids = split;
      }
   }
}

my $score = $score_lookup{ "A" . "R" };   # -2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...