1

我正在用 Perl 编写一个脚本,它在蛋白质序列(字符串)中搜索一个主题(子字符串)。要搜索的主题序列(或子字符串)是 hhhDDDssEExD,其中:

  • h是任何疏水性氨基酸
  • s是任何小氨基酸
  • x是任何氨基酸
  • h,s,x可以分别有多个

一个变量可以分配多个值吗?如果是,我该怎么做?我想将多个值的列表分配给一个变量。

4

5 回答 5

3

似乎您想要某种模式匹配。这可以通过使用正则表达式的字符串来完成。

于 2009-05-06T12:42:23.903 回答
3

您可以在正则表达式中使用字符类。你提到的课程是:

 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/
于 2009-05-06T13:53:04.700 回答
2

我不是 perl 方面的专家,因此很可能有一种更快的方法,但似乎//列表上下文中的匹配运算符 " " 是您所需要的。当您将匹配操作的结果分配给列表时,匹配运算符将采用列表上下文并返回一个带有每个括号分隔的子表达式的列表。如果您使用 " g" 标志指定全局匹配,它将返回每个子表达式的所有匹配的列表。例子:

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

会打印出来

x.x.x

我假设您对这 5 种类型hDsE和中的每一种都有一个正则表达式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 的匹配运算符正则表达式

于 2009-05-06T13:49:28.703 回答
0

我可能会走得很远,但听起来你想要一个带有内置方法的对象作为字符串输出。

如果你从一个字符串开始,就像你提到的那样,你可以将字符串作为一个新对象传递给类,使用每个人已经建议的正则表达式来解析出你将作为变量分配给该对象的块。最后,您可以让它根据该对象的变量输出一个字符串,例如:

 $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。但是,如果我正确理解了您的问题,那么您正在寻找一种方法来从字符串中获取所有信息,但将其与该字符串绑定。那将是对象和类。

于 2009-05-06T14:20:26.243 回答
0

您可能需要一个数组(或 arrayref)或一个模式(qr//)。

或者也许Quantum::Superpositions

于 2009-05-06T14:51:31.330 回答