Perl $字符串到哈希表的转换

时间:2012-04-14 13:27:04

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

我正在研究一些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被调用)需要打印它的全名,因为每个单个碱基对被读取(一次一个)。所以当字符串说 ATATCGCG

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

如果这对于字符串来说太棘手了,我可以使用数组作为起点。非常感谢你的帮助。

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

我的另一个问题是确保用户只能输入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)";
 }

我不完全确定如何回到原始的印刷声明

4 个答案:

答案 0 :(得分:3)

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

use warnings;
use strict;

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

my $string = 'ATATCGCG';
my @array = split(//, $string);
foreach (@array) {
    my $char = $_;
    print $nucleotide_bases{$char}, ' ';
}

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

答案 1 :(得分:3)

我假设您正在尝试从字符串中解码各种字母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", ... );

答案 2 :(得分:0)

<强> 脚本:

#!/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 

答案 3 :(得分:0)

在所有Perl程序开始时,请始终 use strictuse warnings,尤其是那些您正在寻求帮助的人。这样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";