【问题标题】:Perl $strings to hash tables conversionPerl $strings 到哈希表的转换
【发布时间】:2012-04-26 14:16:53
【问题描述】:

我正在研究一些 DNA(A、T、C 和 G,有可能加入 U)

现在我有一个非常长的字符串,里面充满了不确定长度的 DNA。我已经完成了核苷酸碱基的代码。

%nucleotide_bases = ( A => Adenine, 
                      T => Thymine, 
                      G => Guanine, 
                  C => Cytosine );

 $nucleotide_bases{'U'} = 'This is a RNA base called Uracil';#T=U for RNA

现在我需要做的就是放入某种循环以从字符串中读取每个字符。由于此代码适用于学生,因此需要简单。几周前我自己开始使用 perl,在那之前是 java。

在读取每个碱基对(一次一个)时,字符串(它被称为 $string1)需要打印它的全名。所以当字符串说 ATTCGCG

屏幕的输出需要读取: 腺嘌呤 胸腺嘧啶 腺嘌呤 胸腺嘧啶 胞嘧啶 鸟嘌呤 胞嘧啶 鸟嘌呤

如果从字符串做这件事太棘手,我可以使用数组作为起点。非常感谢您的帮助。

优秀的答案。我们现在都准备好了。

我遇到的另一个问题是关于确保用户只能输入 DNA 碱基(A、T、C 和 G)。我认为这称为输入验证。

print "Please enter your first DNA sequence now: \n";
$userinput1=<>;
chomp $userinput1;

您将如何在那里添加输入验证?除非满足条件,否则应始终重新询问第一个打印语句。

我知道我需要类似的东西

 if($userinput1 ne 'a' or 't' or 'c' or 'g') {
 print "Please enter DNA only (A, T, C or G)";
 }

我不完全确定如何回到原来的打印语句

【问题讨论】:

    标签: string perl type-conversion user-input hash


    【解决方案1】:

    使用配方Processing a String One Character at a Time,我想出了这个:

    使用警告; 使用严格; 我的 %核苷酸碱基 = ( A => '腺嘌呤', T => '胸腺嘧啶', G => '鸟嘌呤', C => '胞嘧啶' ); 我的 $string = 'ATATCGCG'; 我的@array = split(//, $string); foreach (@array) { 我的 $char = $_; 打印 $核苷酸碱基{$char}, ' '; }

    请注意,我使用的是use warningsuse strict(作为初学者,您可能也应该这样做),所以我必须在基本名称周围添加引号。另外,程序最后会打印出一个额外的空格。

    【讨论】:

    • 您可以使用for my $char (split //, $string) 来节省一些输入,IMO 使您的代码更清晰。
    【解决方案2】:

    我假设您正在尝试从字符串中解码各种字母 A、T、G 和 C 并打印出它们的全名。

    print "$nucleotide_bases{$_} " for split //, $string;
    

    或者使用数组:

    my @array = map $nucleotide_bases{$_}, split(//, $string);
    print "@array"; # quoted to insert spaces between elements.
    

    作为split 的替代方案,您可以使用正则表达式,它将排除任何不相关的字符进行解码:

    my @array = $string =~ /[ATCG]/g;
    

    哦,当您为哈希分配值时,您需要引用这些值。 Luke Girvin 的好消息。

    my %nucleotide_bases = ( A => "Adenine", ... );
    

    【讨论】:

      【解决方案3】:

      脚本:

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      my %nucleotide_bases = ( A => 'Adenine',
                               T => 'Thymine',
                               G => 'Guanine',
                               C => 'Cytosine',
                               U => 'Uracil' );
      
      my $string1 = 'ATATCGCG';
      
      $string1 =~ s/([ATGCU])/{$nucleotide_bases{$1}.' '}/ge;
      
      print $string1, "\n";
      

      输出:

      Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine 
      

      【讨论】:

      • 优秀的答案。我们现在都准备好了。我遇到的另一个问题是关于确保用户只能输入 DNA 碱基(A、T、C 和 G)。我认为这称为输入验证。 [CODE] print "请现在输入您的第一个 DNA 序列:\n"; $userinput1=;咬$用户输入1; [/CODE] 你将如何在那里添加输入验证?除非满足条件,否则应始终重新询问第一个打印语句。我知道我需要类似 [CODE[ if($userinput1 ne 'a' or 't' or 'c' or 'g')
      【解决方案4】:

      总是 use strictuse warnings 在所有 Perl 程序的开头,尤其是那些你正在寻求帮助的程序。这样,Perl 将修复许多您没有注意到的简单错误,并且您将更快地生成工作代码。

      这可以非常简单地完成,只需将字符串拆分为字符,使用哈希来翻译它们,然后再将它们连接起来。

      这个程序演示了这个想法。请注意,我留下了构建散列的代码,就像您提供的那样,只是因为您可能更喜欢这种方式。

      use strict;
      use warnings;
      
      my %nucleotide_bases = (
        A => 'Adenine', 
        T => 'Thymine', 
        G => 'Guanine', 
        C => 'Cytosine',
      );
      $nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA
      
      my $chain = 'ATATCGCG';
      
      my $expand = join ' ', map $nucleotide_bases{$_}, split //, $chain;
      
      print $expand, "\n";
      

      输出

      Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine
      

      编辑

      根据要求,这是从控制台读取序列并在提供的序列无效时重复。输出与前面代码相同。

      use strict;
      use warnings;
      
      my %nucleotide_bases = (
        A => 'Adenine', 
        T => 'Thymine', 
        G => 'Guanine', 
        C => 'Cytosine',
      );
      $nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA
      
      my $userinput1;
      while () {
        print "Please enter your first DNA sequence now: ";
        chomp ($userinput1 = uc <>);
        last unless $userinput1 =~ /[^ATGC]/;
        printf qq("$userinput1" is an invalid sequence\n);
      } 
      
      my $expand = join ' ', map $nucleotide_bases{$_}, split //, $userinput1;
      
      print $expand, "\n";
      

      【讨论】:

      • 太棒了!你可能还拯救了世界 - 谢谢 :)
      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 2016-04-03
      • 2012-11-11
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多