如何为特定的Perl变量分配许多值?

时间:2009-05-06 12:32:37

标签: regex perl pattern-matching

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

  • h 是任何疏水性氨基酸
  • s 是任何小氨基酸
  • x 是任何氨基酸
  • h,s,x 可以单独包含多个

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

6 个答案:

答案 0 :(得分:3)

好像你想要某种模式匹配。这可以使用正则表达式使用字符串来完成。

答案 1 :(得分: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/

答案 2 :(得分:2)

我不是perl的专家,所以很可能有更快的方法,但似乎列表上下文中的匹配运算符“//”就是你需要的。将匹配操作的结果分配给列表时,匹配运算符将采用列表上下文并返回包含每个括号分隔的子表达式的列表。如果使用“g”标志指定全局匹配,则它将返回每个子表达式的所有匹配项的列表。例如:

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

将打印出来

x.x.x

我假设你有5种hDsEx中的每一种都有正则表达式。你没有说这些部分是单个字符还是多个字符,所以我假设它们可以是多个字符。如果是这样,您的解决方案可能是这样的:

$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的match operatorregular expressions

答案 3 :(得分:1)

答案 4 :(得分: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。但是,如果我正确理解你的问题,你正在寻找一种方法来从字符串中获取所有信息,但保持与该字符串绑定。那将是对象和类。

答案 5 :(得分:0)

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

或者Quantum::Superpositions