r787 - in packages: . libchemistry-elements-perl libchemistry-elements-perl/branches libchemistry-elements-perl/branches/upstream libchemistry-elements-perl/branches/upstream/current
Carlo Segre
segre-guest@costa.debian.org
Mon, 14 Mar 2005 07:42:54 +0100
Author: segre-guest
Date: 2005-03-14 07:42:53 +0100 (Mon, 14 Mar 2005)
New Revision: 787
Added:
packages/libchemistry-elements-perl/
packages/libchemistry-elements-perl/branches/
packages/libchemistry-elements-perl/branches/upstream/
packages/libchemistry-elements-perl/branches/upstream/current/
packages/libchemistry-elements-perl/branches/upstream/current/Changes
packages/libchemistry-elements-perl/branches/upstream/current/Elements.pm
packages/libchemistry-elements-perl/branches/upstream/current/MANIFEST
packages/libchemistry-elements-perl/branches/upstream/current/Makefile.PL
packages/libchemistry-elements-perl/branches/upstream/current/README
packages/libchemistry-elements-perl/branches/upstream/current/chart_test
packages/libchemistry-elements-perl/tags/
Log:
[svn-inject] Installing original source of libchemistry-elements-perl
Added: packages/libchemistry-elements-perl/branches/upstream/current/Changes
===================================================================
--- packages/libchemistry-elements-perl/branches/upstream/current/Changes 2005-03-14 06:40:09 UTC (rev 786)
+++ packages/libchemistry-elements-perl/branches/upstream/current/Changes 2005-03-14 06:42:53 UTC (rev 787)
@@ -0,0 +1,9 @@
+Revision history for Perl extension Chemistry::Elements.
+
+97.1018 Sun Oct 19 00:34:18 1997
+ - original version; created by h2xs 1.18
+
+97.1102 Sun Nov 2 21:36:29 PST 1997
+ - gutsy enough to actually release it for testing and comments
+ - working on a German version to be released RSN (just need a free hour)
+
Added: packages/libchemistry-elements-perl/branches/upstream/current/Elements.pm
===================================================================
--- packages/libchemistry-elements-perl/branches/upstream/current/Elements.pm 2005-03-14 06:40:09 UTC (rev 786)
+++ packages/libchemistry-elements-perl/branches/upstream/current/Elements.pm 2005-03-14 06:42:53 UTC (rev 787)
@@ -0,0 +1,801 @@
+package Chemistry::Elements;
+
+use strict;
+require 5.003;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD
+ $debug %names %elements $maximum_Z);
+
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(get_Z get_symbol get_name);
+@EXPORT = qw();
+$VERSION = 0.91;
+
+sub Version { return $VERSION };
+
+use subs qw(_get_name_by_Z
+ _get_symbol_by_Z
+ _get_name_by_symbol
+ _get_Z_by_symbol
+ _get_symbol_by_name
+ _get_Z_by_name
+ _is_Z
+ _is_name
+ _is_symbol
+ _format_name
+ _format_symbol
+ );
+
+
+$debug = 0;
+
+%names =
+(
+ 1 => 'Hydrogen',
+ 2 => 'Helium',
+ 3 => 'Lithium',
+ 4 => 'Beryllium',
+ 5 => 'Boron',
+ 6 => 'Carbon',
+ 7 => 'Nitrogen',
+ 8 => 'Oxygen',
+ 9 => 'Fluorine',
+ 10 => 'Neon',
+ 11 => 'Sodium',
+ 12 => 'Magnesium',
+ 13 => 'Aluminium',
+ 14 => 'Silicon',
+ 15 => 'Phosphorous',
+ 16 => 'Sulfur',
+ 17 => 'Chlorine',
+ 18 => 'Argon',
+ 19 => 'Potassium',
+ 20 => 'Calcium',
+ 21 => 'Scandium',
+ 22 => 'Titanium',
+ 23 => 'Vanadium',
+ 24 => 'Chromium',
+ 25 => 'Manganese',
+ 26 => 'Iron',
+ 27 => 'Cobolt',
+ 28 => 'Nickel',
+ 29 => 'Copper',
+ 30 => 'Zinc',
+ 31 => 'Gallium',
+ 32 => 'Germanium',
+ 33 => 'Arsenic',
+ 34 => 'Selenium',
+ 35 => 'Bromine',
+ 36 => 'Krypton',
+ 37 => 'Rubidium',
+ 38 => 'Strontium',
+ 39 => 'Yttrium',
+ 40 => 'Zirconium',
+ 41 => 'Nobium',
+ 42 => 'Molybdenum',
+ 43 => 'Technetium',
+ 44 => 'Ruthenium',
+ 45 => 'Rhodium',
+ 46 => 'Paladium',
+ 47 => 'Silver',
+ 48 => 'Cadmium',
+ 49 => 'Indium',
+ 50 => 'Tin',
+ 51 => 'Antimony',
+ 52 => 'Tellurium',
+ 53 => 'Iodine',
+ 54 => 'Xenon',
+ 55 => 'Cesium',
+ 56 => 'Barium',
+ 57 => 'Lanthanum',
+ 58 => 'Cerium',
+ 59 => 'Praesodium',
+ 60 => 'Neodymium',
+ 61 => 'Promethium',
+ 62 => 'Samarium',
+ 63 => 'Europium',
+ 64 => 'Gadolinium',
+ 65 => 'Terbium',
+ 66 => 'Dysprosium',
+ 67 => 'Holmium',
+ 68 => 'Erbium',
+ 69 => 'Thulium',
+ 70 => 'Ytterbium',
+ 71 => 'Lutetium',
+ 72 => 'Hafnium',
+ 73 => 'Tantalum',
+ 74 => 'Tungsten',
+ 75 => 'Rhenium',
+ 76 => 'Osmium',
+ 77 => 'Iridium',
+ 78 => 'Platinum',
+ 79 => 'Gold',
+ 80 => 'Mercury',
+ 81 => 'Thalium',
+ 82 => 'Lead',
+ 83 => 'Bismuth',
+ 84 => 'Polonium',
+ 85 => 'Astatine',
+ 86 => 'Radon',
+ 87 => 'Francium',
+ 88 => 'Radium',
+ 89 => 'Actinum',
+ 90 => 'Thorium',
+ 91 => 'Protactinium',
+ 92 => 'Uranium',
+ 93 => 'Neptunium',
+ 94 => 'Plutonium',
+ 95 => 'Americium',
+ 96 => 'Curium',
+ 97 => 'Berkelium',
+ 98 => 'Californium',
+ 99 => 'Einsteinium',
+100 => 'Fermium',
+101 => 'Mendelevium',
+102 => 'Nobelium',
+103 => 'Lawerencium',
+104 => 'Rutherfordium',
+105 => 'Dubnium',
+106 => 'Seaborgium',
+107 => 'Bohrium',
+108 => 'Hassium',
+109 => 'Meitnerium'
+);
+
+{
+my @a = sort {$a <=> $b } keys %names;
+$maximum_Z = pop @a;
+}
+
+%elements = (
+'H' => '1', '1' => 'H',
+'He' => '2', '2' => 'He',
+'Li' => '3', '3' => 'Li',
+'Be' => '4', '4' => 'Be',
+'B' => '5', '5' => 'B',
+'C' => '6', '6' => 'C',
+'N' => '7', '7' => 'N',
+'O' => '8', '8' => 'O',
+'F' => '9', '9' => 'F',
+'Ne' => '10', '10' => 'Ne',
+'Na' => '11', '11' => 'Na',
+'Mg' => '12', '12' => 'Mg',
+'Al' => '13', '13' => 'Al',
+'Si' => '14', '14' => 'Si',
+'P' => '15', '15' => 'P',
+'S' => '16', '16' => 'S',
+'Cl' => '17', '17' => 'Cl',
+'Ar' => '18', '18' => 'Ar',
+'K' => '19', '19' => 'K',
+'Ca' => '20', '20' => 'Ca',
+'Sc' => '21', '21' => 'Sc',
+'Ti' => '22', '22' => 'Ti',
+'V' => '23', '23' => 'V',
+'Cr' => '24', '24' => 'Cr',
+'Mn' => '25', '25' => 'Mn',
+'Fe' => '26', '26' => 'Fe',
+'Co' => '27', '27' => 'Co',
+'Ni' => '28', '28' => 'Ni',
+'Cu' => '29', '29' => 'Cu',
+'Zn' => '30', '30' => 'Zn',
+'Ga' => '31', '31' => 'Ga',
+'Ge' => '32', '32' => 'Ge',
+'As' => '33', '33' => 'As',
+'Se' => '34', '34' => 'Se',
+'Br' => '35', '35' => 'Br',
+'Kr' => '36', '36' => 'Kr',
+'Rb' => '37', '37' => 'Rb',
+'Sr' => '38', '38' => 'Sr',
+'Y' => '39', '39' => 'Y',
+'Zr' => '40', '40' => 'Zr',
+'Nb' => '41', '41' => 'Nb',
+'Mo' => '42', '42' => 'Mo',
+'Tc' => '43', '43' => 'Tc',
+'Ru' => '44', '44' => 'Ru',
+'Rh' => '45', '45' => 'Rh',
+'Pd' => '46', '46' => 'Pd',
+'Ag' => '47', '47' => 'Ag',
+'Cd' => '48', '48' => 'Cd',
+'In' => '49', '49' => 'In',
+'Sn' => '50', '50' => 'Sn',
+'Sb' => '51', '51' => 'Sb',
+'Te' => '52', '52' => 'Te',
+'I' => '53', '53' => 'I',
+'Xe' => '54', '54' => 'Xe',
+'Cs' => '55', '55' => 'Cs',
+'Ba' => '56', '56' => 'Ba',
+'La' => '57', '57' => 'La',
+'Ce' => '58', '58' => 'Ce',
+'Pr' => '59', '59' => 'Pr',
+'Nd' => '60', '60' => 'Nd',
+'Pm' => '61', '61' => 'Pm',
+'Sm' => '62', '62' => 'Sm',
+'Eu' => '63', '63' => 'Eu',
+'Gd' => '64', '64' => 'Gd',
+'Tb' => '65', '65' => 'Tb',
+'Dy' => '66', '66' => 'Dy',
+'Ho' => '67', '67' => 'Ho',
+'Er' => '68', '68' => 'Er',
+'Tm' => '69', '69' => 'Tm',
+'Yb' => '70', '70' => 'Yb',
+'Lu' => '71', '71' => 'Lu',
+'Hf' => '72', '72' => 'Hf',
+'Ta' => '73', '73' => 'Ta',
+'W' => '74', '74' => 'W',
+'Re' => '75', '75' => 'Re',
+'Os' => '76', '76' => 'Os',
+'Ir' => '77', '77' => 'Ir',
+'Pt' => '78', '78' => 'Pt',
+'Au' => '79', '79' => 'Au',
+'Hg' => '80', '80' => 'Hg',
+'Tl' => '81', '81' => 'Tl',
+'Pb' => '82', '82' => 'Pb',
+'Bi' => '83', '83' => 'Bi',
+'Po' => '84', '84' => 'Po',
+'At' => '85', '85' => 'At',
+'Rn' => '86', '86' => 'Rn',
+'Fr' => '87', '87' => 'Fr',
+'Ra' => '88', '88' => 'Ra',
+'Ac' => '89', '89' => 'Ac',
+'Th' => '90', '90' => 'Th',
+'Pa' => '91', '91' => 'Pa',
+'U' => '92', '92' => 'U',
+'Np' => '93', '93' => 'Np',
+'Pu' => '94', '94' => 'Pu',
+'Am' => '95', '95' => 'Am',
+'Cm' => '96', '96' => 'Cm',
+'Bk' => '97', '97' => 'Bk',
+'Cf' => '98', '98' => 'Cf',
+'Es' => '99', '99' => 'Es',
+'Fm' => '100', '100' => 'Fm',
+'Md' => '101', '101' => 'Md',
+'No' => '102', '102' => 'No',
+'Lr' => '103', '103' => 'Lr',
+'Rf' => '104', '104' => 'Rf',
+'Ha' => '105', '105' => 'Ha',
+'Sg' => '106', '106' => 'Sg',
+'Bh' => '107', '107' => 'Bh',
+'Hs' => '108', '108' => 'Hs',
+'Mt' => '109', '109' => 'Mt'
+);
+
+sub new
+ {
+ my $class = shift;
+ my $data = shift;
+
+ my $self = {};
+ bless $self, $class;
+
+ if( _is_Z $data )
+ {
+ $self->Z($data);
+ }
+ elsif( _is_symbol $data )
+ {
+ $self->symbol($data);
+ }
+ elsif( _is_name $data )
+ {
+ $self->name($data);
+ }
+ else
+ {
+ return;
+ }
+
+ return $self;
+ }
+
+sub Z
+ {
+ my $self = shift;
+ my $data = shift;
+
+ return $self->{'Z'} unless $data;
+
+ unless( _is_Z $data )
+ {
+ $self->error('$data is not a valid proton number');
+ return;
+ }
+
+ $self->{'Z'} = $data;
+ $self->{'name'} = _get_name_by_Z $data;
+ $self->{'symbol'} = _get_symbol_by_Z $data;
+
+ return $data;
+ }
+
+sub name
+ {
+ my $self = shift;
+ my $data = shift;
+
+ return $self->{'name'} unless $data;
+
+ unless( _is_name $data)
+ {
+ $self->error('$data is not a valid name');
+ return;
+ }
+
+ $self->{'name'} = _format_name $data;
+ $self->{'Z'} = _get_Z_by_name $data;
+ $self->{'symbol'} = _get_symbol_by_Z($self->Z);
+
+ return $data;
+ }
+
+sub symbol
+ {
+ my $self = shift;
+ my $data = shift;
+
+ return $self->{'symbol'} unless $data;
+
+ unless( _is_symbol $data )
+ {
+ $self->error('$data is not a valid chemical symbol');
+ return;
+ }
+
+ $self->{'symbol'} = _format_symbol $data;
+ $self->{'Z'} = _get_Z_by_symbol $data;
+ $self->{'name'} = _get_name_by_Z $self->Z;
+
+ return $data;
+ }
+
+sub get_symbol
+ {
+ my $thingy = shift;
+
+ #since we were asked for a name, we'll suppose that we were passed
+ #either a chemical symbol or a Z.
+ return _get_symbol_by_Z($thingy) if _is_Z $thingy;
+ return _get_symbol_by_name($thingy) if _is_name $thingy;
+
+ #maybe it's already a symbol...
+ return _format_symbol $thingy if _is_symbol $thingy;
+
+ #we were passed something wierd. pretend we don't know anything.
+ return;
+ }
+
+sub _get_symbol_by_name
+ {
+ my $name = shift;
+
+ return unless _is_name $name;
+
+ $name = _format_name $name;
+
+ #not much we can do if they don't pass a proper name
+ foreach( keys %names )
+ {
+ next unless $name eq $names{$_};
+ return $elements{$_}
+ }
+
+ return;
+ }
+
+sub _get_symbol_by_Z
+ {
+ my $Z = shift;
+
+ #just in case we were passed a symbol rather
+ #then a number
+ return unless _is_Z $Z;
+
+ return $elements{$Z} if defined $elements{$Z};
+
+ return;
+ }
+
+sub get_name
+ {
+ my $thingy = shift;
+
+ #since we were asked for a name, we'll suppose that we were passed
+ #either a chemical symbol or a Z.
+ return _get_name_by_symbol($thingy) if _is_symbol $thingy;
+ return _get_name_by_Z($thingy) if _is_Z $thingy;
+
+ #maybe it's already a name
+ return _format_name $thingy if _is_name $thingy;
+
+ #we were passed something wierd. pretend we don't know anything.
+ return;
+ }
+
+
+sub _get_name_by_symbol
+ {
+ return _get_name_by_Z( _get_Z_by_symbol(shift) );
+ }
+
+sub _get_name_by_Z
+ {
+ my $Z = shift;
+
+ return unless _is_Z $Z;
+
+ #not much we can do if they don't pass a proper number
+ if( defined $names{$Z} )
+ {
+ return $names{$Z};
+ }
+
+ return;
+ }
+
+sub get_Z
+ {
+ my $thingy = shift;
+
+ #since we were asked for a name, we'll suppose that we were passed
+ #either a chemical symbol or a Z.
+ return _get_Z_by_symbol($thingy) if _is_symbol $thingy;
+ return _get_Z_by_name($thingy) if _is_name $thingy;
+
+ #maybe it's already a Z
+ return $thingy if _is_Z $thingy;
+
+ #we were passed something wierd. pretend we don't know anything.
+ return;
+ }
+
+sub _get_Z_by_name
+ {
+ my $name = shift;
+ my ($key, $value);
+
+ while( ($key, $value) = each %names )
+ {
+ #do a case insensitive match
+ if( lc($value) eq lc($name) )
+ {
+ return $key;
+ }
+ }
+
+ return;
+ }
+
+sub _get_Z_by_symbol
+ {
+ my $symbol = shift;
+
+ #ensure that the first letter is upper case and that the
+ #others are lower case. this way we can accept data from
+ #sources too dumb to know about chemical symbols or proper
+ #cases. (and they exist. i've seen them.)
+ $symbol =~ s/^(.)(.*)$/uc($1).lc($2)/e;
+
+ if( defined $elements{$symbol} )
+ {
+ return $elements{$symbol};
+ }
+
+ return;
+ }
+
+########################################################################
+########################################################################
+#
+# the _is_* functions do some minimal data checking to help other
+# functions guess what sort of input they received
+
+########################################################################
+sub _is_name
+ {
+ my $data = shift;
+
+ #at least three alphabetic characters
+ return 0 unless $data =~ m/^[a-z][a-z][a-z][a-z]*$/i;
+
+ $data = _format_name $data;
+
+ foreach( keys %names )
+ {
+ return 1 if $data eq $names{$_};
+ }
+
+ return 0;
+ }
+
+########################################################################
+sub _is_symbol
+ {
+ my $data = shift;
+
+ return 0 unless $data =~ m/^u?[a-z]?[a-z]$/i;
+
+ $data =~ s/^(.)(.*)/uc($1) . lc($2)/e;
+
+ return 1 if defined $elements{$data};
+
+ return 0;
+ }
+
+########################################################################
+sub _is_Z
+ {
+ my $data = shift;
+
+ return 0 unless $data =~ m/^1?\d?\d$/;
+ return 1 if $data > 0 and $data <= $maximum_Z;
+ return 0;
+ }
+
+########################################################################
+# _format_symbol
+#
+# input: a string that is supoosedly a chemical symbol
+# output: the string with the first character in uppercase and the
+# rest lowercase
+#
+# there is no data checking involved. this function doens't know
+# and doesn't care if the data are valid. it just does its thing.
+sub _format_symbol
+ {
+ my $data = shift;
+
+ $data =~ s/^(.)(.*)/uc($1).lc($2)/e;
+
+ return $data;
+ }
+
+########################################################################
+# _format_name
+#
+# input: a string that is supoosedly a chemical element's name
+# output: the string with the first character in uppercase and the
+# rest lowercase
+#
+# there is no data checking involved. this function doens't know
+# and doesn't care if the data are valid. it just does its thing.
+#
+# this looks like _format_symbol, but it logically isn't. someday
+# it might do something different than _format_symbol
+sub _format_name
+ {
+ my $data = shift;
+
+ $data =~ s/^(.)(.*)/uc($1).lc($2)/e;
+
+ return $data;
+ }
+
+########################################################################
+sub AUTOLOAD
+ {
+ my $self = shift;
+ my $data = shift;
+
+ return unless ref $self;
+
+ my $method_name = $AUTOLOAD;
+
+ $method_name =~ s/.*:://;
+
+ if( $data )
+ {
+ $self->{$method_name} = $data;
+ }
+ elsif( defined $self->{$method_name} )
+ {
+ return $self->{$method_name};
+ }
+ else
+ {
+ return;
+ }
+ }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Chemistry::Elements - Perl extension for working with Chemical Elements
+
+=head1 SYNOPSIS
+
+ use Chemistry::Elements qw(get_name get_Z get_symbol);
+
+ # the constructor can use different input
+ $element = new Chemistry::Elements $atomic_number;
+ $element = new Chemistry::Elements $chemical_symbol;
+ $element = new Chemistry::Elements $element_name;
+
+ # you can make up your own attributes by specifying
+ # a method (which is really AUTOLOAD)
+ $element->molar_mass(22.989) #sets the attribute
+ $MM = $element->molar_mass #retrieves the value
+
+=head1 DESCRIPTION
+
+There are two parts to the module: the object stuff and the exportable
+functions for use outside of the object stuff. The exportable
+functions are discussed in EXPORTABLE FUNCTIONS.
+
+Chemistry::Elements provides an easy, object-oriented way to
+keep track of your chemical data. Using either the atomic
+number, chemical symbol, or element name you can construct
+an Element object. Once you have an element object, you can
+associate your data with the object by making up your own
+methods, which the AUTOLOAD function handles. Since each
+chemist is likely to want to use his or her own data, or
+data for some unforesee-able property, this module does not
+try to be a repository for chemical data.
+
+The Element object constructor tries to be as flexible as possible -
+pass it an atomic number, chemical symbol, or element name and it
+tries to create the object.
+
+ # the constructor can use different input
+ $element = new Chemistry::Elements $atomic_number;
+ $element = new Chemistry::Elements $chemical_symbol;
+ $element = new Chemistry::Elements $element_name;
+
+once you have the object, you can define your own methods simply
+by using them. Giving the method an argument (others will be
+ignored) creates an attribute with the method's name and
+the argument's value.
+
+ # you can make up your own attributes by specifying
+ # a method (which is really AUTOLOAD)
+ $element->molar_mass(22.989) #sets the attribute
+ $MM = $element->molar_mass #retrieves the value
+
+The atomic number, chemical symbol, and element name can be
+retrieved in the same way.
+
+ $atomic_number = $element->Z;
+ $name = $element->name;
+ $symbol = $element->symbol;
+
+These methods can also be used to set values, although changing
+any of the three affects the other two.
+
+ $element = new Chemistry::Elements('Lead');
+
+ $atomic_number = $element->Z; # $atomic_number is 82
+
+ $element->Z(79);
+
+ $name = $element->name; # $name is 'Gold'
+
+=head1 EXPORTABLE FUNCTIONS
+
+These functions can be exported. They are not exported by default.
+
+=head2 get_symbol()
+
+This function attempts to return the symbol of the chemical element given
+either the chemical symbol, element name, or atmoic number. The
+function does its best to interpret inconsistent input data (e.g.
+chemcial symbols of mixed and single case).
+
+ use Chemistry::Elements qw(get_symbol);
+
+ $name = get_symbol('Fe'); #$name is 'Fe'
+ $name = get_symbol('fe'); #$name is 'Fe'
+ $name = get_symbol(26); #$name is 'Fe'
+ $name = get_symbol('Iron'); #$name is 'Fe'
+ $name = get_symbol('iron'); #$name is 'Fe'
+
+If no symbol can be found, nothing is returned.
+
+Since this function will return the symbol if it is given a symbol,
+you can use it to test whether a string is a chemical symbol
+(although you have to play some tricks with case since get_symbol
+will try its best despite the case of the input data).
+
+ if( lc($string) eq lc( get_symbol($string) ) )
+ {
+ #stuff
+ }
+
+You can modify the symbols (e.g. you work for UCal ;) ) by changing
+the data at the end of this module.
+
+=head2 get_name()
+
+This function attempts to return the name the chemical element given
+either the chemical symbol, element name, or atomic number. The
+function does its best to interpret inconsistent input data (e.g.
+chemcial symbols of mixed and single case).
+
+ $name = get_name('Fe'); #$name is 'Iron'
+ $name = get_name('fe'); #$name is 'Iron'
+ $name = get_name(26); #$name is 'Iron'
+ $name = get_name('Iron'); #$name is 'Iron'
+ $name = get_name('iron'); #$name is 'Iron'
+
+If there is no Z can be found, nothing is returned.
+
+Since this function will return the name if it is given a name,
+you can use it to test whether a string is a chemical element name
+(although you have to play some tricks with case since get_name
+will try its best despite the case of the input data).
+
+ if( lc($string) eq lc( get_name($string) ) )
+ {
+ #stuff
+ }
+
+You can modify the names (e.g. for different languages) by changing
+the data at the end of this module.
+
+=head2 get_Z()
+
+This function attempts to return the atomic number of the chemical
+element given either the chemical symbol, element name, or atomic
+number. The function does its best to interpret inconsistent input data
+(e.g. chemcial symbols of mixed and single case).
+
+ $name = get_Z('Fe'); #$name is 26
+ $name = get_Z('fe'); #$name is 26
+ $name = get_Z(26); #$name is 26
+ $name = get_Z('Iron'); #$name is 26
+ $name = get_Z('iron'); #$name is 26
+
+If there is no Z can be found, nothing is returned.
+
+Since this function will return the Z if it is given a Z,
+you can use it to test whether a string is an atomic number.
+You might want to use the string comparison in case the
+$string is not a number (in which case the comparison
+will be false save for the case when $string is undefined).
+
+ if( $string eq get_Z($string) )
+ {
+ #stuff
+ }
+
+The package constructor automatically finds the largest defined
+atomic number (in case you add your own heavy elements).
+
+=head2 AUTOLOADing methods
+
+You can pseudo-define additional methods to associate data with objects.
+For instance, if you wanted to add a molar mass attribute, you
+simply pretend that there is a molar_mass method:
+
+ $element->molar_mass($MM); #add molar mass datum in $MM to object
+
+Similiarly, you can retrieve previously set values by not specifying
+an argument to your pretend method:
+
+ $datum = $element->molar_mass();
+
+ #or without the parentheses
+ $datum = $element->molar_mass;
+
+If a value has not been associated with the pretend method and the
+object, the pretend method returns nothing.
+
+I had thought about providing basic data for the elements, but
+thought that anyone using this module would probably have their
+own data. If there is an interest in canned data, perhaps I can
+provide mine :)
+
+=head1 TO DO
+
+I would like make this module easily localizable so that one could
+specify other names or symbols for the elements (i.e. a different
+language or a different perspective on the heavy elements). If
+anyone should make changes to the data, i would like to get a copy
+so that i can include it in future releases :)
+
+=head1 AUTHOR
+
+brian d foy <comdog@panix.com>
+
+=cut
Added: packages/libchemistry-elements-perl/branches/upstream/current/MANIFEST
===================================================================
--- packages/libchemistry-elements-perl/branches/upstream/current/MANIFEST 2005-03-14 06:40:09 UTC (rev 786)
+++ packages/libchemistry-elements-perl/branches/upstream/current/MANIFEST 2005-03-14 06:42:53 UTC (rev 787)
@@ -0,0 +1,6 @@
+Changes
+MANIFEST
+Makefile.PL
+Elements.pm
+README
+chart_test
Added: packages/libchemistry-elements-perl/branches/upstream/current/Makefile.PL
===================================================================
--- packages/libchemistry-elements-perl/branches/upstream/current/Makefile.PL 2005-03-14 06:40:09 UTC (rev 786)
+++ packages/libchemistry-elements-perl/branches/upstream/current/Makefile.PL 2005-03-14 06:42:53 UTC (rev 787)
@@ -0,0 +1,7 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+ 'NAME' => 'Chemistry::Elements',
+ 'VERSION_FROM' => 'Elements.pm', # finds $VERSION
+);
Added: packages/libchemistry-elements-perl/branches/upstream/current/README
===================================================================
--- packages/libchemistry-elements-perl/branches/upstream/current/README 2005-03-14 06:40:09 UTC (rev 786)
+++ packages/libchemistry-elements-perl/branches/upstream/current/README 2005-03-14 06:42:53 UTC (rev 787)
@@ -0,0 +1,73 @@
+NAME
+
+ Chemistry::Elements - Perl extension for working the Chemical Elements
+
+SYNOPSIS
+
+ use Chemistry::Elements qw(get_name get_Z get_symbol);
+
+ # the constructor can use different input
+ $element = new Chemistry::Elements $atomic_number;
+ $element = new Chemistry::Elements $chemical_symbol;
+ $element = new Chemistry::Elements $element_name;
+
+ # you can make up your own attributes by specifying
+ # a method (which is really AUTOLOAD)
+ $element->molar_mass(22.989) #sets the attribute
+ $MM = $element->molar_mass #retrieves the value
+
+ # a short demonstartion script, chart_test, is included
+ # with the distribution.
+
+DESCRIPTION
+
+There are two parts to the module: the object stuff and the
+exportable functions for use outside of the object stuff.
+The exportable functions are discussed in EXPORTABLE
+FUNCTIONS.
+
+Chemistry::Elements provides an easy, object-oriented way to
+keep track of your chemical data. Using either the atomic
+number, chemical symbol, or element name you can construct
+an Element object. Once you have an element object, you can
+associate your data with the object by making up your own
+methods, which the AUTOLOAD function handles. Since each
+chemist is likely to want to use his or her own data, or
+data for some unforesee-able property, this module does not
+try to be a repository for chemical data.
+
+EXPORTABLE FUNCTIONS
+
+These functions can be exported. They are not exported by
+default.
+
+get_symbol()
+
+ This function attempts to return the symbol of the chemical
+ element given either the chemical symbol, element name, or
+ atmoic number. The function does its best to interpret
+ inconsistent input data (e.g. chemcial names of mixed and
+ single case).
+
+get_name()
+
+ This function attempts to return the name the chemical
+ element given either the chemical symbol, element name, or
+ atomic number. The function does its best to interpret
+ inconsistent input data (e.g. chemcial symbols of mixed and
+ single case).
+
+get_Z()
+
+ This function attempts to return the atomic number of the
+ chemical element given either the chemical symbol, element
+ name, or atomic number. The function does its best to
+ interpret inconsistent input data (e.g. chemcial symbols of
+ mixed and single case).
+
+AUTHOR
+
+brian d foy <comdog@computerdog.com>
+
+
+
Added: packages/libchemistry-elements-perl/branches/upstream/current/chart_test
===================================================================
--- packages/libchemistry-elements-perl/branches/upstream/current/chart_test 2005-03-14 06:40:09 UTC (rev 786)
+++ packages/libchemistry-elements-perl/branches/upstream/current/chart_test 2005-03-14 06:42:53 UTC (rev 787)
@@ -0,0 +1,36 @@
+#!/usr/bin/perl -w
+use strict;
+
+#This script demostrates the use of the object oriented interface
+#that the Chemistry::Elements module provides. At the prompt you
+#can enter a Z, name, or chemical symbol to create an Elements
+#object. Once you have an object you can define your own methods
+#through which you associate data with the object.
+
+use Chemistry::Elements qw();
+
+print "> ";
+
+#you can specify a Z, name, or symbol.
+#case does not matter since the module should figure it out
+while( <STDIN> )
+ {
+ chomp $_;
+
+ my $obj = new Chemistry::Elements $_;
+
+ print "no object could be created\n> " unless ref $obj;
+ next unless ref $obj;
+
+ #accessor methods for the Element object
+ my $Z = $obj->Z;
+ my $name = $obj->name;
+ my $symbol = $obj->symbol;
+
+ #this is just to demonstrate defining your own method
+ $obj->pretend_method($obj->Z / 3.2);
+ my $MM = $obj->pretend_method;
+
+ print "$Z,$name,$symbol,$MM\n> ";
+
+ }