<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2013/4/29 Andrew Shulga <span dir="ltr"><<a href="mailto:pcontrol@mail.ru" target="_blank">pcontrol@mail.ru</a>></span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Добрый день!<br>
<br>
Для  собственных  нужд понадобилось сделать кулькулятор молярной массы<br>
элементов.   Пример:   Cа2O5(NO2(HO)3)2    заранее  известен  вес  каждого<br>
элемента Са=40, О=16, N=14, H=1. В числовом виде формула будет такая:<br>
40*2+16*5+(14+16*2+(1+16)*3)*2<br>
Итоговое значение элементов:<br>
Ca=80<br>
O=240<br>
N=28<br>
H=6<br>
<br>
Не  могу  придумать  алгоритм  для  подсчета  количества  элементов  в<br>
формуле. Подскажите кто-нибудь.<br>
<span class=""><font color="#888888"><br></font></span></blockquote><div><br></div><div><br></div><div><div>$ perl -E 'my $s = "Ca2O5(NO2(HO)3)2"; my %h = (Ca =>40, O=>16, N => 14, H =>1); $e = join "|", keys %h; $s =~ s/($e|[0-9]+|\()/ my $res = ""; $res .= pos($s)>0 && substr($s,pos($s)-1, 1) ne "("? $h{$1} || $1 eq "("? "+" : "*" : ""; $res .= $h{$1} || $1; $res /ge; say $s; say eval "$s"'</div>
<div><br></div><div>40*2+16*5+(14+16*2+(1+16)*3)*2</div><div>354</div></div><div><br></div><div><div>$ perl -E 'package Boo; use overload "+" => sub { my $r = bless { }, "Boo"; $r->{$_} = $_[0]{$_}+$_[1]{$_} foreach keys %{$_[0]}, keys %{$_[1]}; $r }, "*" => sub { $_ *= $_[1] foreach values %{$_[0]}; $_[0] }; package main; sub boo { bless { $_[0] => 1 }, "Boo" }; my $s = "Ca2O5(NO2(HO)3)2"; my %h = (Ca =>40, O=>16, N => 14, H =>1); $e = join "|", keys %h; $s =~ s/($e|[0-9]+|\()/ my $res = ""; $res .= pos($s)>0 && substr($s,pos($s)-1, 1) ne "("? $h{$1} || $1 eq "("? "+" : "*" : ""; $res .= $h{$1}? "boo(\"$1\")" : $1; $res /ge; say $s; use Data::Dumper; say Dumper eval "$s"'</div>
<div><br></div><div>boo("Ca")*2+boo("O")*5+(boo("N")+boo("O")*2+(boo("H")+boo("O"))*3)*2</div><div>$VAR1 = bless( {</div><div>                 'H' => '6',</div>
<div>                 'O' => 15,</div><div>                 'N' => '2',</div><div>                 'Ca' => '2'</div><div>               }, 'Boo' );</div></div><div>
<br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><font color="#888888">
<br>
<br>
<br>
<br>
<br>
<br>
--<br>
С уважением,<br>
Andrew<br>
<br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Best regards, Ruslan.
</div></div>