#!/usr/bin/perl #require v5.6.1; use strict; use diagnostics; #use warnings; #use Data::Dumper; #use CGI qw/:standard/; #use CGI::Carp 'fatalsToBrowser'; my (%ticker, %portfolio); my @stock_names = ('Derpco', 'Tetrabytz', 'Mojo inc', 'Freke', 'Mega'); @portfolio{@stock_names} = (0) x @stock_names; @ticker{@stock_names} = map { price => generate_random(10, 100), volitility => int(rand(7)) * 5 + 5 }, @stock_names; my $goal = query_user( qq|\nWhat Goal In Cash Do You Want To Set? :| ); notify_user( qq|Thanks\n\n| ); my $date = 0; my $cash = generate_random(500, 1000); until ( $cash > $goal or $date == 31 ) { # update prices foreach my $stock ( @ticker{@stock_names} ) { $$stock{price} += generate_random($$stock{volitility}); $$stock{price} = 0 if $$stock{price} < 1; } # liquidate holdings if price hits 0 foreach my $stock ( @stock_names ) { $portfolio{$stock} = 0 if $ticker{$stock}{price} == 0 } $date++; print qq|Last Day!! better sell your stock| if $date == 30; while (1) { notify_user(daily_report(\%portfolio, \%ticker, $cash, $date)); my $transaction = query_user( qq|Would you like to (B)uy or (S)ell or are you (D)one? | ); if ($transaction =~/^s/i) { $cash += sell(\%portfolio, \%ticker); } elsif ($transaction =~/^b/i) { $cash = buy(\%portfolio, \%ticker, $cash); } elsif ( $transaction =~ /^d/i ) { last; } elsif ( $transaction =~ /^q/i ) { exit; } } } if ( $cash > $goal ) { my $dif = $cash - $goal; notify_user( qq|Yay! you won, you beat your goal by \$$dif\n| ); } if ($cash < $goal) { my $dif = $goal - $cash; notify_user( qq|Boo! you lost, you missed your goal by \$$dif\n| ); } sub daily_report { my ($portfolio, $ticker, $cash, $date) = @_; my @report; push @report, qq|\n\nYour Stock Report for January $date\n\n|, qq| Holdings Value\tCompany\n\n|; push @report, qq|\t$$portfolio{$_}\t \$$$ticker{$_}{price}\t$_\n| for keys %$portfolio; push @report, qq|\nYou have \$$cash in cash and \$|, portfolio_value( @_ ), qq| in stocks.\n|; return join '', @report; } sub generate_random { my ($start, $end) = @_; $end = 0 - ($start = 0 - $start) unless defined $end; return int( $start + rand($end - $start + 1) ); } sub portfolio_value { my ($portfolio, $ticker) = @_; my $total_value = 0; $total_value += $$portfolio{$_} * $$ticker{$_}{price} for keys %$portfolio; return $total_value; } sub sell { my ($portfolio, $ticker) = @_; my $cash = 0; my $stock_to_sell = query_user(q|What Stock would you like to Sell? |); foreach my $stock ( keys %$portfolio ) { if ( $stock =~ /$stock_to_sell/i ) {; if ( $$ticker{$stock}{price} == 0 ) { notify_user( qq|$stock has filed for protection from creditors|, q| - Your holdings were liquidated.| ); } else { my $shares_to_sell = query_user( qq|\n\nYou have $portfolio{$stock} shares in $stock\n|, q|Sell How many? :| ); if ( $shares_to_sell > $$portfolio{$stock} ) { notify_user( qq|Sorry, your account is not set up for short sales.\n| ); } else { $$portfolio{$stock} -= $shares_to_sell; $cash = $shares_to_sell * $$ticker{$stock}{price}; } } last; } } return $cash; } sub buy { my ($portfolio, $ticker, $cash) = @_; my $stock_to_buy = query_user( q|What Stock would you like to buy? |); foreach my $stock ( keys %$portfolio ) { if ( $stock =~/$stock_to_buy/i ) { if ( $$ticker{$stock}{price} == 0 ) { notify_user( qq|Sorry, trading has been suspended in $stock.| ); } else { my $shares_to_buy = query_user( qq|\n\nYou have $portfolio{$stock} shares in $stock and \$$cash\n|, q|Buy How many (max |, int( $cash / $$ticker{$stock}{price} ), q|) :| ); if ( $cash < $$ticker{$stock}{price} * $shares_to_buy ) { notify_user( qq|Sorry, this isn't a margin account.\n| ); } else { $$portfolio{$stock} += $shares_to_buy; $cash -= $shares_to_buy * $$ticker{$stock}{price}; } } last; } } return $cash; } sub query_user { notify_user(@_) if @_; chomp (my $answer = ); return $answer; } sub notify_user { return print @_; } __END__