Perl 全局定义散列

Perl 全局定义散列,perl,hash,Perl,Hash,我正在编写一些代码来处理一个数据集,但似乎有一个问题,我看了一段时间后还没有解决。我认为(并希望!)解决方案相当简单,如果有人能为我指出正确的方向,我将不胜感激 #!/usr/bin/perl use strict; use warnings; my %predictions = ('DAMAGING' => 'Disease', 'TOLERATED' => 'Polymorphism', 'A' => 'Ala',

我正在编写一些代码来处理一个数据集,但似乎有一个问题,我看了一段时间后还没有解决。我认为(并希望!)解决方案相当简单,如果有人能为我指出正确的方向,我将不胜感激

#!/usr/bin/perl
use strict;
use warnings;

my %predictions = ('DAMAGING' => 'Disease',
           'TOLERATED' => 'Polymorphism',
           'A' => 'Ala',
           'C' => 'Cys',
           'D' => 'Asp',
           'P' => 'Pro',
           'V' => 'Val',
           'L' => 'Leu',
           'I' => 'Ile',
           'M' => 'Met',
           'F' => 'Phe',
           'Y' => 'Tyr',
           'W' => 'Trp',
           'H' => 'His',
           'K' => 'Lys',
           'R' => 'Arg',
           'Q' => 'Gln',
           'N' => 'Asn',
           'E' => 'Glu',
           'S' => 'Ser',
           'T' => 'Thr',
           'G' => 'Gly');


while(<>) {
  chomp;
  {
    if (length($_)) {
      ProcessData($_);
    }
  }
}

sub ProcessData {
    my ($line) = @_;
    my @fields = split(/\s+/,$line);
    if ($fields[2] =~ /(.)(\d+)(.)/) {
      my $native = $1;
      my $resnum = $2;
      my $mutant = $3;
      print "$fields[1] $predictions{$native} $resnum $pedictions{$mutant} \n"; 
    }  
}
#/usr/bin/perl
严格使用;
使用警告;
我的%预测=(“破坏性”=>“疾病”,
“容忍”=>“多态性”,
'A'=>'Ala',
“C”=>“Cys”,
'D'=>'Asp',
“P”=>“Pro”,
“V”=>“Val”,
‘L’=>‘Leu’,
“I”=>“Ile”,
'M'=>'Met',
‘F’=>‘Phe’,
“Y”=>“Tyr”,
“W”=>“Trp”,
“H”=>“他的”,
“K”=>“Lys”,
'R'=>'Arg',
“Q”=>“Gln”,
'N'=>'Asn',
“E”=>“Glu”,
'S'=>'Ser',
'T'=>'Thr',
‘G’=>‘Gly’;
while(){
咀嚼;
{
如果(长度($33;)){
ProcessData(美元);
}
}
}
子进程数据{
我的($line)=@;
my@fields=拆分(/\s+/,$line);
如果($fields[2]=~/(\d+)/){
my$native=$1;
my$resnum=$2;
my$Variant=$3;
打印“$fields[1]$predictions{$native}$resnum$pedictions{$mutant}\n”;
}  
}
我试图使用哈希值更改的字段如下所示:

A8726P
并且预期输出类似于
Ala 8726 Pro


提前感谢

很高兴看到一些示例输入数据,但我认为您的问题是访问的是哈希
%pedictions
,而不是
%predictions
。您显示的代码给出了错误

Global symbol "%pedictions" requires explicit package
这是一个死赠品

如果我创建一个包含单个记录的文件

AA  BB  A8726P DD EE FF
然后我得到输出

BB Ala 8726 Pro 
这似乎是你所期望的

整理一下你的程序也会有帮助。请注意,
split'
(或者如果您正在splitg
$\uu
,只需
split
)比
split/\s+//code>好,因为如果记录中有任何前导空格,后者将首先返回空字段

use strict;
use warnings;

my %predictions = (
  DAMAGING  => 'Disease',
  TOLERATED => 'Polymorphism',
  A         => 'Ala',
  C         => 'Cys',
  D         => 'Asp',
  P         => 'Pro',
  V         => 'Val',
  L         => 'Leu',
  I         => 'Ile',
  M         => 'Met',
  F         => 'Phe',
  Y         => 'Tyr',
  W         => 'Trp',
  H         => 'His',
  K         => 'Lys',
  R         => 'Arg',
  Q         => 'Gln',
  N         => 'Asn',
  E         => 'Glu',
  S         => 'Ser',
  T         => 'Thr',
  G         => 'Gly'
);

my ($filename) = @ARGV;
open my $fh, '<', $filename or die qq{Unable to open "$filename" for input: $!};

while (<$fh>) {
  ProcessData($_) if /\S/;
}

sub ProcessData {
  my ($line) = @_;
  my @fields = split ' ', $line;

  if ($fields[2] =~ /\A(.)(\d+)(.)\z/) {
    my $native = $1;
    my $resnum = $2;
    my $mutant = $3;

    print "$fields[1] $predictions{$native} $resnum $predictions{$mutant} \n";

  }
}

我得到的错误消息是:全局符号“%pedictions”需要在./processFathmmPreds.pl第50行显示包名。如果您有输入错误,应该是
predictions
,因此输入文件的开头是:1 P45381 R168C DAMAGING2 Q06187 K430E DAMAGINGEtc,用于1000行。我试着使用你写的代码,但遇到了一些问题-我现在只是再试一次-会让你知道我的进展如何。非常感谢你的帮助!我从这两条记录中获得代码的
P45381 Arg 168 Cys
Q06187 Lys 430 Glu
P45381 Arg 168 Cys 
Q06187 Lys 430 Glu 
P15529 Ser 240 Pro 
P00966 Pro 96 Ser 
P15289 Asp 255 His 
P10275 Gly 820 Ala 
P10275 Asp 864 Gly 
O75828 Val 93 Ile 
P04075 Cys 339 Tyr 
O60885 Ala 371 Gly 
P03950 Lys 84 Glu 
P35670 Val 1146 Met 
P11597 Ala 390 Pro 
Q9UM73 Arg 1275 Leu 
Q99856 Lys 320 Glu 
P12821 Thr 1187 Met 
P10275 Gly 708 Ala 
P15529 Cys 35 Tyr 
P05156 His 183 Arg 
Q06187 Ile 370 Met 
P15056 Glu 586 Lys 
P15289 Pro 231 Thr 
P68133 Gly 270 Cys 
Q9BZ11 Ala 365 Ser 
P15289 Ile 179 Ser 
P35520 Ile 435 Thr 
Q9BWV1 Val 713 Met 
P68133 Pro 334 Ser 
P21549 Gly 190 Arg 
P49748 Gln 159 Arg 
P05067 Ile 716 Val 
P06732 Gly 243 Ala 
P42773 Ala 72 Pro 
P49748 Lys 247 Glu 
O15382 Thr 186 Arg 
P45954 Glu 376 Gly 
Q8WVQ1 Leu 224 Pro 
P02768 Glu 382 Lys 
P06276 Ala 229 Thr 
Q8WXF7 Tyr 196 Cys 
P37023 His 314 Tyr 
Q16790 Gln 326 Arg 
P07451 Val 31 Ile 
P06727 Asn 147 Ser 
P00966 Asp 296 Gly 
P00813 Ala 215 Thr 
P42771 Pro 114 Leu 
P30566 Pro 100 Ala 
P21549 Leu 153 Val 
Q9H8M2 Ala 170 Thr 
O75828 Val 244 Met 
P42771 Gln 50 Arg