On Wed, Mar 10, 2010 at 12:36 PM, Kelly Jones <kelly.terry.jo...@gmail.com> wrote: > How do I easily model first-in-first-out (FIFO) financial transactions > in Perl? Example: > > % I buy 100 shares of XYZ for $8/share on Day 1, another 100 shares > for $9/share on Day 2, and another 100 shares for $10/share on Day 3. > > % On Day 4, I sell 150 shares for $11/share. I calculate my profit > assuming FIFO: I sold the 100 shares I bought on Day 1 (profit: > $3/share times 100 shares or $300), and I sold 50 of the shares I > bought on Day 2 (profit: $2/share times 50 shares or $100), for a > total profit of $400. > > I can think of some ugly ways to model this in Perl, but no good/clean > ways. Any thoughts?
The normal way to implement FIFO in Perl is by using push and shift on arrays: push new data on the tail, shift old data off the head. Addition is commutative, so you don't need to calculate the profit per share to calculate the total profit. Just keep an array of the price paid for each share. The following is long hand, but it illustrates the basic principles of of FIFO in Perl. use warnings; use strict; my @bought; # days 1,2,3 my @days = ( 8, 9, 10 ); foreach my $price (@days) { push( @bought, $price ) for ( 1 .. 100 ); } # day 4 my $sell_price = 11; my $sell_shares = 150; my $gross = $sell_price * $sell_shares; my $cost = 0; for ( 1 .. $sell_shares ) { $cost += shift @bought; } # step 3: profit! print 'We made $', $gross - $cost, " today!!\n"; HTH, -- j -------------------------------------------------- This email and attachment(s): [ ] blogable; [ x ] ask first; [ ] private and confidential daggerquill [at] gmail [dot] com http://www.tuaw.com http://www.downloadsquad.com http://www.engatiki.org values of β will give rise to dom! -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/