in reply to subroutine help
I'm sure it's been done before in the other answers, and maybe even more efficiently, but this is what I think you're trying to get to:
#!/bin/perl #if your program doesn't begin with this, you deserve to fail... use strict; # Data::Dumper not used in example, # but you always need it when you expand the module :-) use Data::Dumper; # you can either hardcode all atomic weights in ... # ..or read them from a data file/ database my %weights = ( 'C' => 12.0, 'O' => 16.0, 'Co' => 58.933195, 'H' => 1.008 ); my @test = ( 'C12H22O11' ); for my $form (@test) { my @array = $form =~ /[A-Z][a-z]*\d*/ig; my $weight = getweight(@array); print "Weight of @array : $weight\n"; } sub getweight { my @atoms =@_; my $weight = 0.0; for my $element (@atoms) { if ($element =~ /([A-Z][a-z]*)(\d*)/) { my $eweight = $weights{$1}; my $mult = $2 || 1; $weight += ($eweight*$mult); print STDERR "Adding $1 ($eweight)* $mult\n"; } } print STDERR "Molecule: @atoms\n"; return $weight; }
Feel free to modify for your purposes and correct naming,read atomic weights from a file etc.
Output from above program:
Updated to reflect the fact that some transuranic elements have 3 letter identifiers, not just two. :-)Adding C (12)* 12 Adding H (1.008)* 22 Adding O (16)* 11 Molecule: C12 H22 O11 Weight of C12 H22 O11 : 342.176
Also updated to reflect suggestions by Kenosis and others below....
Whilst adequate for the indicated input, the method of parsing and atomic weight calculation is a little lightweight and basic, and doesn't handle more complex molecules, so consider using Chemistry::Mol or a similar package if you want to get round the flaws that have been indicated below....
A Monk aims to give answers to those who have none, and to learn from those who know more.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: subroutine help
by tobyink (Canon) on Nov 29, 2012 at 09:05 UTC | |
by space_monk (Chaplain) on Nov 29, 2012 at 09:13 UTC | |
Re^2: subroutine help
by Kenosis (Priest) on Nov 29, 2012 at 08:22 UTC | |
Re^2: subroutine help
by frozenwithjoy (Priest) on Nov 29, 2012 at 07:51 UTC | |
by space_monk (Chaplain) on Nov 29, 2012 at 08:03 UTC | |
by frozenwithjoy (Priest) on Nov 29, 2012 at 08:10 UTC | |
Re^2: subroutine help
by perlguru22 (Acolyte) on Nov 29, 2012 at 08:10 UTC |
In Section
Seekers of Perl Wisdom