Как назначить много значений определенной переменной Perl? - PullRequest
1 голос
/ 06 мая 2009

Я пишу скрипт на Perl, который ищет мотив (подстроку) в последовательности белка (строка). Последовательность мотива для поиска (или подстрока): hhhDDDssEExD, где:

  • ч - любая гидрофобная аминокислота
  • с - любая маленькая аминокислота
  • x - любая аминокислота
  • ч, с, х может иметь более одного значения отдельно

Можно ли назначить более одной величины одной переменной? Если да, то как мне это сделать? Я хочу назначить список из нескольких значений переменной.

Ответы [ 6 ]

3 голосов
/ 06 мая 2009

Вы можете использовать классы символов в своем регулярном выражении. Классы, которые вы упомянули, будут:

 h -> [VLIM]
 s -> [AG]
 x -> [A-IK-NP-TV-Z]

Последний означает «от A до I, от K до N, от P до T, от V до Z».

Регулярное выражение для вашего примера будет:

/[VLIM]{3}D{3}[AG]{2}E{2}[A-IK-NP-TV-Z]D/
3 голосов
/ 06 мая 2009

Кажется, вы хотите какое-то сопоставление с образцом. Это можно сделать со строками с использованием регулярных выражений.

2 голосов
/ 06 мая 2009

Я не большой специалист по Perl, так что, возможно, есть более быстрый путь к этому, но кажется, что вам нужен оператор соответствия "//" в контексте списка. Когда вы присваиваете результат операции сопоставления списку, оператор сопоставления принимает контекст списка и возвращает список с каждым из подвыражений, разделенных скобками. Если вы укажете глобальные совпадения с флагом "g", он вернет список всех совпадений каждого подвыражения. Пример:

# print a list of each match for "x" in "xxx"
@aList = ("xxx" =~ /(x)/g);
print(join(".", @aList));

Распечатает

x.x.x

Я предполагаю, что у вас есть регулярное выражение для каждого из этих 5 типов h, D, s, E и x. Вы не сказали, является ли каждая из этих частей одним или несколькими символами, поэтому я предполагаю, что они могут состоять из нескольких символов. Если это так, ваше решение может выглядеть примерно так:

$h = ""; # Insert regex to match "h"
$D = ""; # Insert regex to match "D"
$s = ""; # Insert regex to match "s"
$E = ""; # Insert regex to match "E"
$x = ""; # Insert regex to match "x"

$sequenceRE = "($h){3}($D){3}($s){2}($E){2}($x)($D)"

if ($line =~ /$sequenceRE/) {
    $hPart = $1;
    $sPart = $3;
    $xPart = $5;

    @hValues = ($hPart =~ /($h)/g);
    @sValues = ($sPart =~ /($s)/g);
    @xValues = ($xPart =~ /($x)/g);
}

Я уверен, что есть кое-что, что я пропустил, и есть некоторые тонкости perl, которые я упустил, но это должно помочь вам в этом. Для получения дополнительной информации прочтите регулярные выражения в Perl * и регулярные выражения .

.
1 голос
/ 06 мая 2009

Регулярные выражения Perl - это то, что вам нужно

0 голосов
/ 06 мая 2009

Вы, вероятно, хотите массив (или arrayref) или шаблон (qr //).

Или, может быть, Квант :: Суперпозиции .

0 голосов
/ 06 мая 2009

Я мог бы быть далеко, но звучит так, будто вы хотите, чтобы объект со встроенным методом выводил в виде строки.

Если вы начнете со строки, подобной той, которую вы упомянули, вы можете передать строку в класс как новый объект, использовать регулярные выражения, как все уже предложили проанализировать порции, которые вы затем назначите в качестве переменных для этот объект. Наконец, вы можете получить вывод строки на основе переменных этого объекта, например:

 $string = "COHOCOHOCOHOCOHOCOHOC";
 $sugar = new Organic($string);

 Class Organic {
 $chem;
       function __construct($chem) {
           $hydro_find = "OHO";
           $carb_find = "C";
           $this-> hydro = preg_find ($hydro_find, $chem);
           $this -> carb = preg_find ($carb_find, $chem);

        function __TO_STRING() {
           return $this->carb."="$this->hydro;
        }
   }

 echo $sugar;

Хорошо, в конце концов, это развалилось, и это был псевдо-php, а не perl. Но если я правильно понимаю ваш вопрос, вы ищете способ получить всю информацию из строки, но держите ее привязанной к этой строке. Это были бы объекты и классы.

...