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:
Adding C (12)* 12
Adding H (1.008)* 22
Adding O (16)* 11
Molecule: C12 H22 O11
Weight of C12 H22 O11 : 342.176
Updated to reflect the fact that some transuranic elements have 3 letter identifiers, not just two. :-)
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.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
Outside of code tags, you may need to use entities for some characters:
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.
|
|