2016-04-11 37 views
0
哈希

我與有信息線,看起來像這樣的文件格式工作:我如何從文件中讀取行到Perl中

ATOM 1N的LYS A 56 20.508 14.774 -7.432 1.00 50.83 N

我想要的只是第一個數字,以及上面例子中'56'後面的三個數字;所以即時通訊使用正則表達式來獲取該信息。然後,我如何將這些信息放入哈希中?

到目前爲止,我有:

my $pdb_file = $ARGV[0]; 
open (PDBFILE, "<$pdb_file") or die ("$pdb_file not found"); 
while (<PDBFILE>) { 
if ($_=~ /^ATOM\s+(\d+)\s+\w+\s+\w+\s+\w+\s+\d+\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)/) { 
my $atom = $1; 
my $xcor = $2; 
my $ycor = $3; 
my $zcor = $4; 
print "AtomNumber: $atom\t xyz: $xcor $ycor $zcor\n"; 
} 
} 
+0

'$ myhash {$ atom} = [$ xcor,$ ycor,$ zcor]' – Kenney

回答

4

而不是使用正則表達式的,我反而建議使用split把它拆分成空白領域。這將更快,更強大,它不依賴於每個領域格式的詳細知識(可能會改變,就像數字有一個你忘記考慮的減號一樣)。這很容易理解。

my @fields = split /\s+/, $line; 

然後你就可以挑出來的字段(例如,第一個數字是2場,所以$fields[1]),並把它們放到你的哈希值。

my %coordinate = (
    atom => $fields[1], 
    x => $fields[6], 
    y => $fields[7], 
    z => $fields[8] 
); 

你正在讀一堆線,所以你會做一堆散列,必須去某個地方。我建議把它們全部放在另一個帶有某種獨特字段的散列中作爲關鍵字。可能是​​字段。

$atoms{$coordinate{atom}} = \%coordinate;