Небольшая помощь с петлями на Perl - PullRequest
0 голосов
/ 21 февраля 2011

У меня проблемы с указанием правильного алгоритма.Я перебираю входной файл с циклами.Проблема, с которой я столкнулся, заключается в последней петле.

#!/usr/bin/perl 
# Lab #4
# Judd Bittman

# http://www-users.cselabs.umn.edu/classes/Spring-2011/csci3003/index.php?page=labs 
# this site has what needs to be in the lab
# lab4 is the lab instructions
# yeast protein is the part that is being read

use warnings;
use strict;

my $file = "<YeastProteins.txt";
open(my $proteins, $file);
my @identifier;
my @qualifier;
my @molecularweight;
my @pi;
while (my $line1 = <$proteins>) {
    #print $line1;
    chomp($line1);
    my @line = split(/\t/, $line1);
    push(@identifier,      $line[0]);
    push(@qualifier,       $line[1]);
    push(@molecularweight, $line[2]);
    push(@pi,              $line[3]);
}
my $extreme  = 0;
my $ex_index = 0;
for (my $index = 1; $index < 6805; $index++) {
    if (   defined($identifier[$index])
        && defined($qualifier[$index])
        && defined($molecularweight[$index])
        && defined($pi[$index])) {
# print"$identifier[$index]\t:\t$qualifier[$index]:\t$molecularweight[$index]:\n$pi[$index]";
    }
    if (   defined($identifier[$index])
        && defined($qualifier[$index])
        && defined($pi[$index])) {
        if (abs($pi[$index] - 7) > $extreme && $qualifier[$index] eq "Verified")
        {
            $extreme  = abs($pi[$index] - 7);
            $ex_index = $identifier[$index];
            print $extreme. " " . $ex_index . "\n";
        }
    }
}
print $extreme;
print "\n";
print $ex_index;
print "\n";

# the part above does part b of the assignment
# YLR204W,its part of the Mitochondrial inner membrane protein as well as a processor.
my $exindex = 0;
my $high    = 0;

# two lines above and below is part c
# there is an error and I know there is something wrong
for (my $index = 1; $index < 6805; $index++) {
    if (   defined($qualifier[$index])
        && ($qualifier[$index]) eq "Verified"
        && defined($molecularweight[$index])
        && (abs($molecularweight[$index]) > $high)) {
        $high    = (abs($molecularweight[$index]) > $high);    # something wrong on this line, I know I wrote something wrong
        $exindex = $identifier[$index];
    }
}

print $high;
print "\n";
print $exindex;
print "\n";
close($proteins);
exit;

В последней петле я хочу, чтобы моя петля удерживала проверенный белок с самой высокой молекулярной массой.Это во входном файле.Какой код можно использовать, чтобы сообщить программе, что я хочу сохранить наибольшее число и его имя?Я чувствую, что я очень близко, но я не могу на это положиться.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Во-первых, примечание о perl - в целом, чаще используют циклы стиля foreach, а не индексированные циклы в стиле c. Например:

for my $protein (@proteins) {
  #do something with $p
}

(Ваша ситуация может потребовать этого, я просто подумал, что упомяну это)

Для решения вашей конкретной проблемы:

$high = (abs($molecularweight[$index])>$high);

$ high устанавливается на результат выполнения логического теста. Удалите часть> $ high (которая проверяется в вашем операторе if), и вы, скорее всего, получите то, что хотели.

1 голос
/ 21 февраля 2011

Просто измените:

$high    = (abs($molecularweight[$index]) > $high);

На это:

$high    = abs($molecularweight[$index]) if (abs($molecularweight[$index]) > $high);

В конце цикла $ high будет самым высоким значением в массиве $ молекулярный вес.

1 голос
/ 21 февраля 2011

Скорее всего, вам нужна более сложная структура данных, например, вложенный хэш. Трудно привести надежный пример без дополнительных знаний о данных, но, скажем, ваш первый идентификатор был abc, второй - def и т. Д .:

my %protein_entries = (
    abc => {
        qualifier        => 'something',
        molecular_weight => 1234,
        pi               => 'something',
    },
    def => {
        qualifier        => 'something else',
        molecular_weight => 5678,
        pi               => 'something else',
    },
    # …
);

Тогда, вместо того, чтобы иметь несколько разных массивов и отслеживать, кому из них принадлежит, вы получаете элементы вроде:

Затем, если вы хотите получить максимальную молекулярную массу, вы можете отсортировать идентификаторы по их молекулярной массе, а затем выделить самую высокую:

my $highest = (sort {
    $protein_entries{$a}{molecular_weight} 
    <=> 
    $protein_entries{$b}{molecular_weight}
} keys %protein_entries)[1];

У вас проблемы с вашим алгоритмом, потому что вы в основном не правильно структурируете свои данные.

В этом примере $highest будет содержать def, затем вы можете вернуться назад и получить $protein_entries{def}{molecular_weight} или любой из других ключей в анонимном хеше, на который ссылается $protein_entries{def}, таким образом, можно легко вызвать любой соответствующие связанные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...