[thelist] Perl Script
Jim Davis
jdavis at hy-tech.net
Sun Oct 28 09:01:33 CST 2001
This is a pretty large script for posting to a message board, but I know
next to nothing about PERL so I only removed the HTML content to save space.
The script itself is a classic Mortgage calculator. The problem with it is
that it generates to many closing </TABLE> Tags, here is a partial output of
the HTML where the problem is. I would appreciate any feedback I can get on
this.
Thanks,
Jim Davis
<table border>
<tr><th>Month<th>Prin<th>Int<th>Balance
<tr><td align=right> Jan <td align=right> 63.77 <td align=right>
687.50 <td align=right> 99936.23
<tr><td align=right> Feb <td align=right> 64.20 <td align=right>
687.06 <td align=right> 99872.03
<tr><td align=right> Mar <td align=right> 64.65 <td align=right>
686.62 <td align=right> 99807.38
<tr><td align=right> Apr <td align=right> 65.09 <td align=right>
686.18 <td align=right> 99742.29
<tr><td align=right> May <td align=right> 65.54 <td align=right>
685.73 <td align=right> 99676.75
<tr><td align=right> Jun <td align=right> 65.99 <td align=right>
685.28 <td align=right> 99610.76
<tr><td align=right> Jul <td align=right> 66.44 <td align=right>
684.82 <td align=right> 99544.32
<tr><td align=right> Aug <td align=right> 66.90 <td align=right>
684.37 <td align=right> 99477.42
<tr><td align=right> Sep <td align=right> 67.36 <td align=right>
683.91 <td align=right> 99410.06
<tr><td align=right> Oct <td align=right> 67.82 <td align=right>
683.44 <td align=right> 99342.24
<tr><td align=right> Nov <td align=right> 68.29 <td align=right>
682.98 <td align=right> 99273.95
<tr><td align=right> Dec <td align=right> 68.76 <td align=right>
682.51 <td align=right> 99205.19
</table>
<hr><li><b>FOR 2000 : Int=$ 8220.39 Prin=$ 794.81 Bal=$
99205.19</b>
</table>
<li><b>FOR 2001 : Int=$ 8152.28 Prin=$ 862.92 Bal=$ 98342.28</b>
</table>
<li><b>FOR 2002 : Int=$ 8078.34 Prin=$ 936.86 Bal=$ 97405.42</b>
</table>
<li><b>FOR 2003 : Int=$ 7998.06 Prin=$ 1017.14 Bal=$ 96388.28</b>
</table>
<li><b>FOR 2004 : Int=$ 7910.90 Prin=$ 1104.30 Bal=$ 95283.97</b>
</table>
<li><b>FOR 2005 : Int=$ 7816.27 Prin=$ 1198.93 Bal=$ 94085.04</b>
</table>
<li><b>FOR 2006 : Int=$ 7713.53 Prin=$ 1301.67 Bal=$ 92783.37</b>
</table>
<li><b>FOR 2007 : Int=$ 7601.98 Prin=$ 1413.22 Bal=$ 91370.15</b>
</table>
<li><b>FOR 2008 : Int=$ 7480.88 Prin=$ 1534.32 Bal=$ 89835.83</b>
</table>
<li><b>FOR 2009 : Int=$ 7349.40 Prin=$ 1665.80 Bal=$ 88170.04</b>
</table>
<li><b>FOR 2010 : Int=$ 7206.66 Prin=$ 1808.54 Bal=$ 86361.50</b>
</table>
<li><b>FOR 2011 : Int=$ 7051.68 Prin=$ 1963.52 Bal=$ 84397.98</b>
</table>
<li><b>FOR 2012 : Int=$ 6883.42 Prin=$ 2131.78 Bal=$ 82266.20</b>
</table>
<li><b>FOR 2013 : Int=$ 6700.75 Prin=$ 2314.45 Bal=$ 79951.74</b>
</table>
<li><b>FOR 2014 : Int=$ 6502.41 Prin=$ 2512.78 Bal=$ 77438.96</b>
</table>
<li><b>FOR 2015 : Int=$ 6287.09 Prin=$ 2728.11 Bal=$ 74710.85</b>
</table>
<li><b>FOR 2016 : Int=$ 6053.31 Prin=$ 2961.89 Bal=$ 71748.96</b>
</table>
<li><b>FOR 2017 : Int=$ 5799.50 Prin=$ 3215.70 Bal=$ 68533.26</b>
</table>
<li><b>FOR 2018 : Int=$ 5523.94 Prin=$ 3491.26 Bal=$ 65042.00</b>
</table>
<li><b>FOR 2019 : Int=$ 5224.77 Prin=$ 3790.43 Bal=$ 61251.57</b>
</table>
<li><b>FOR 2020 : Int=$ 4899.96 Prin=$ 4115.24 Bal=$ 57136.33</b>
</table>
<li><b>FOR 2021 : Int=$ 4547.31 Prin=$ 4467.89 Bal=$ 52668.44</b>
</table>
<li><b>FOR 2022 : Int=$ 4164.45 Prin=$ 4850.75 Bal=$ 47817.69</b>
</table>
<li><b>FOR 2023 : Int=$ 3748.78 Prin=$ 5266.42 Bal=$ 42551.27</b>
</table>
<li><b>FOR 2024 : Int=$ 3297.49 Prin=$ 5717.71 Bal=$ 36833.56</b>
</table>
<li><b>FOR 2025 : Int=$ 2807.53 Prin=$ 6207.67 Bal=$ 30625.89</b>
</table>
<li><b>FOR 2026 : Int=$ 2275.58 Prin=$ 6739.62 Bal=$ 23886.27</b>
</table>
<li><b>FOR 2027 : Int=$ 1698.04 Prin=$ 7317.16 Bal=$ 16569.11</b>
</table>
<li><b>FOR 2028 : Int=$ 1071.02 Prin=$ 7944.18 Bal=$ 8624.93</b>
</table>
<li><b>FOR 2029 : Int=$ 390.27 Prin=$ 8624.93 Bal=$ 0.00</b>
</table>
</table>
</ul><hr><h5>Where the final summary is</h5><ul>
<li>Monthly Payment: <b>$ 751.27</b>
#!/usr/bin/perl
@m =
("Foo","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","De
c",
"B/W");
print<<Header;
Content-type: text/html
...Header HTML HERE..
Header
$arglist = $ENV{'QUERY_STRING'}; # For GET
#read(STDIN,$arglist,$ENV{'CONTENT_LENGTH'}); # For POST
$arglist =~ s/%([\da-f]{1,2})/pack(C,hex($1))/eig;
$arglist =~ s/,//g;
@f = split("&",$arglist);
# Actually search for the keys since some browser obviously switches things!
for ($i=0; $i<=$#f; $i++)
{
if (@f[$i] =~ /prin=/) { $prin = substr(@f[$i],5); }
if (@f[$i] =~ /int=/) { $int = substr(@f[$i],4); }
if (@f[$i] =~ /term=/) { $term = substr(@f[$i],5); }
if (@f[$i] =~ /strt=/) { $strm = substr(@f[$i],5); }
if (@f[$i] =~ /stry=/) { $stry = substr(@f[$i],5); }
if (@f[$i] =~ /full=/) { $full = substr(@f[$i],5); }
if (@f[$i] =~ /ppay=/) { $ppay = substr(@f[$i],5); }
if (@f[$i] =~ /apay=/) { $apay = substr(@f[$i],5); }
if (@f[$i] =~ /pay1=/) { $pay1 = substr(@f[$i],5); }
if (@f[$i] =~ /ppno=/) { $ppno = substr(@f[$i],5); }
if (@f[$i] =~ /outt=/) { $outt = substr(@f[$i],5); }
}
$stry2 = $stry; $tint2 = 0;
for ($i = 1; $i < 13; $i++) { if (@m[$i] eq $strm) { $strt = $i; } }
if (length($term) > 4) { $bi_week = 1; $term = 30; }
# Canadian interest conversion
if ($int =~ /C/)
{
$l = length($int) -1;
$cint = substr($int,0,$l);
print "$cint";
$mr = (1 + $cint/200)**(1/6) - 1;
$int = $mr * 1200 ;
printf("<h5>US rate equivalent of %7.3f %% is %7.3f
%%</h5>\n",$cint,$int);
}
$tt = $term * 12; $i = $int / 1200;
if ($tt == 0) { $tt = 360; }
#$temp = (1.0 / (1 + $i) ** $tt);
$temp = (1 + $i) ** -$tt;
if ($temp < 1)
{ $paymt = ($prin * $i) / (1 - $temp); }
else
{ $paymt = $prin / $tt; }
$tint = $paymt * $tt - $prin;
$bal = $prin; $yrint = 0; $yrprin = 0; $mm = 0;
if ($apay =~ /B/) { $apay = $paymt; $bi_week = 1; } # Biweekly addition
if ($outt =~ /Table/)
{
print "<center><h5>For the given values:</h5>\n<table border=1>";
print "<tr><td> Principal <td> <b>\$ $prin</b> \n";
print "<tr><td> Interest Rate <td> <b>$int %</b> \n";
print "<tr><td> Amortization Period <td> <b>$term </b> years\n";
if ( $bi_week > 0) { print "<b>BI-WEEKLY</b>"; }
if ( $ppay > 0) { print "<tr><td> Monthly pre-payment <td>
<b>$ppay</b>\n"; }
print "<tr><td> Starting month <td> <b>@m[$strt] </b>\n";
print "<tr><td> Starting year<td> <b>$stry </b>\n";
print "<tr><td> Monthly Pre-payment<td> <b>\$ $ppay </b>\n";
printf("<tr><td> Annual Pre-payment<td> <b>\$ %10.2f
</b></table></center><hr>\n",$apay);
}
else
{
print "<hr><h5>For the given values:</h5>\n<ul>";
print "<li> Principal = <b>\$ $prin</b> \n";
print "<li> Interest Rate = <b>$int %</b> \n";
print "<li> Amortization Period = <b>$term </b> years\n";
if ( $bi_week > 0) { print "<b>BI-WEEKLY</b>"; }
if ( $ppay > 0) { print "<li> Monthly pre-payment = <b>$ppay</b>\n"; }
print "<li> Starting month = <b>@m[$strt] </b>\n";
print "<li> Starting year= <b>$stry </b>\n";
print "<li> Monthly Pre-payment= <b>\$ $ppay </b>\n";
printf("<li> Annual Pre-payment= <b>\$ %10.2f </b></ul>\n<hr>\n",$apay);
}
if ($bi_week > 0)
{ printf("<h5>Your biweekly payment will be \$ %10.2f</h5>\n",$paymt/2);}
else
{ printf("<h5>Your monthly payment will be \$ %10.2f</h5>\n",$paymt); }
if ( $ppay > 0)
{ printf ("<h5> + Monthly Prepayment of \$ %10.2f = \$ %10.2f</h5>\n",
$ppay,$paymt+$ppay); }
print "<h5>The following mortgage would result for $stry :</h5><ul>\n";
if ($outt =~ /Table/)
{
print "<table border>\n";
print "<tr><th>Month<th>Prin<th>Int<th>Balance\n";
}
# First year
for ($j = $strt; $j <= 12; $j++)
{
$mm++;
if ($mm == $ppno)
{
$bal = $bal - $pay1;
if ($outt =~ /Table/) { print "</table>\n"; }
printf("<h3>Prepayment Time : \$ %10.2f : Principal \$ %10.2f </h3>\n",
$pay1, $bal);
if ($outt =~ /Table/) { print "<table border>\n"; }
}
$mint = $i * $bal; $bal = $bal - $paymt + $mint - $ppay;
$yrint = $yrint + $mint; $mprin = $paymt - $mint + $ppay;
$yrprin = $yrprin + $mprin; $tm++;
if (!($outt =~ /Table/))
{
printf("<li><b>%3s : </b> Prin: \$ %10.2f Int: \$ %10.2f Bal <b>\$
%10.2f</b>\n",
@m[$j], $mprin, $mint, $bal);
}
else
{
# Table
printf("<tr><td align=right> %3s <td align=right> %10.2f <td
align=right> %10.2f <td align=right> %10.2f\n",
@m[$j], $mprin, $mint, $bal);
}
}
if ($apay > 0)
{
$bal = $bal - $apay; $yrprin = $yrprin + $apay;
if ($bi_week > 0) { $tag = "BiWeekly Adj"; } else { $tag = "PREPAY"; }
if ($outt =~ /Table/) { print "</table>\n"; }
printf("<li><b>$tag: </b> Prin: \$ %10.2f Int: \$ %10.2f Bal <b>\$
%10.2f</b>\n",
$apay, 0, $bal);
}
if ($outt =~ /Table/) { print "</table>\n"; }
print "<hr>";
printf("<li><b>FOR %4d : Int=\$ %10.2f Prin=\$ %10.2f Bal=\$ %10.2f</b>\n",
$stry2, $yrint, $yrprin, $bal); $tint2 = $tint2 + $yrint;
# Now do the rest of the amortization
$first_yr = $yrint; $lft = $term - 1;
for ($y = 1; $y <=$term; $y++)
{
if ($full eq "Yes" & $yrint > 0) {
$stry3 = $stry2 + 1; $y2 = $y + 1; $lft2 = $term - $y2 + 1;
#if ($outt =~ /Table/) { print "</table>\n"; }
if ($bal > 0)
{
print "<hr><h5> For Calendar Year $stry3 (Year $y2, $lft2
left)</h5>\n";
if ($outt =~ /Table/) { print "<table border>\n";
print "<tr><th>Month<th>Prin<th>Int<th>Balance\n"; }
}
}
$yrint = 0; $stry2++; $lft = $term - $y; $yrprin = 0;
for ($j = 1; $j <= 12; $j++) {
$mm++;
if ($mm == $ppno)
{
$bal = $bal - $pay1;
printf("<h3>Prepayment Time : \$ %10.2f : Principal \$ %10.2f
</h3>\n",
$pay1, $bal);
}
if ($bal > 1)
{
$mint = $i * $bal; $bal = $bal - $paymt + $mint - $ppay;
$yrint = $yrint + $mint; $mprin = $paymt - $mint + $ppay;
$yrprin = $yrprin + $mprin; $tm++;
if ($full eq "Yes")
{
if (!($outt =~ /Table/))
{
printf("<li><b>%2s : </b> Prin: \$ %10.2f Int: \$ %10.2f Bal <b>\$
%10.2f</b>\n",
@m[$j],$mprin, $mint, $bal);
}
else
{
printf("<tr><td align=right>%2s <td align=right> %10.2f <td
align=right> %10.2f <td align=right> %10.2f\n",
@m[$j],$mprin, $mint, $bal);
}
}
}
else { if ($outt =~ /Table/) { print "</table>\n"; } }
if ($j == 12 | $bal < 1)
{
if ($apay > 0 && $bal > 0)
{ $bal = $bal - $apay; $yrprin = $yrprin + $apay;
if ($bi_week > 0) { $tag = "BiWeekly Adj"; } else { $tag =
"PREPAY"; }
if ($outt =~ /Table/) { print "</table>\n"; }
printf("<li><b>$tag : </b> Prin: \$ %10.2f Int: \$ %10.2f Bal <b>\$
%10.2f</b>\n",
$apay, 0, $bal);
}
if ($yrprin > 0 & $bal >= 0)
{
if ($outt =~ /Table/) { print "</table>\n"; }
printf("<li><b>FOR %4d : Int=\$ %10.2f Prin=\$ %10.2f Bal=\$
%10.2f</b>\n",
$stry2, $yrint, $yrprin, $bal); }
if ($bal < 1) { $j = 12; }
$tint2 = $tint2 + $yrint;
}
}
if ($y == 1) { $yr2_nam = $stry2; $snd_yr = $yrint; $yr2_bal = $bal;}
}
# End main loop
if ($term > 0) { $aint = $tint2 / $term /12; }
if ($outt =~ /Table/) { print "</table>\n"; }
print"</ul><hr><h5>Where the final summary is</h5><ul>\n";
printf ("<li>Monthly Payment: <b>\$ %10.2f</b>\n<li>Total Int:<b>\$
%10.2f</b>(No pre-payment)\n<li>Total Int<b>:\$ %10.2f</b> (As given)\n",
$paymt, $tint, $tint2);
if ($tint2 > 0)
{
printf ("<li><b>SAVINGS:</b> \$ %10.2f Total Interest Saved, %5.2f Years
shorter loan\n",
$tint-$tint2, ($tt - $tm)/12);
}
printf ("<li>%4s Int <b>\$ %10.2f</b>\n<li>%4s Int <b>\$ %10.2f</b>\n",
$stry, $first_yr, $yr2_nam, $snd_yr);
printf ("<li>End Bal Dec $yr2_nam: <b>\$ %10.2f</b>\n",$yr2_bal);
printf ("<li>Avg Int each Month: <b>\$ %10.2f</b>\n",$aint);
if ($apay > 0)
{
$naint = $tint / $tt;
printf("<li><b>SAVINGS:</b> Normal Avg Int/Month : <b>\$ %10.2f, You Save
\$ %10.2f</b>\n",
$naint, $naint - $aint);
}
print "</ul>\n<hr>\n";
# $req_income_28 = $paymt /.28 * 12; $req_income_36 = $paymt /.36 * 12;
#print "To qualify for this loan you would need an annual income
of:\n<ul>\n";
#printf("<li> at <b>28 percent</b> qualifying limit: \$
%10.2f\n",$req_income_28);
#printf("<li> at <b>36 percent</b> qualifying limit: \$
%10.2f\n",$req_income_36);
#print("<li><b>(Assuming no property tax and insurance )</b>\n";
#print "</ul>\n";
print "<a href=\"qualify.cgi\">";
print "Look here for qualifying income requirements</a>";
print<<Trailer;
...FOOTER HTML HERE...
Trailer
-----Original Message-----
From: thelist-admin at lists.evolt.org [mailto:thelist-admin at lists.evolt.org]On
Behalf Of Anthony Baratta
Sent: Saturday, October 27, 2001 6:41 PM
To: thelist at lists.evolt.org
Subject: Re: [thelist] Perl Script
At 08:52 PM 10/27/2001, you wrote:
>Does anyone know of a List or Board I can post a PERL script to for help in
>debugging?
How about here?? Problem synopsis?
---
Anthony Baratta
President
Keyboard Jockeys
"Conformity is the refuge of the unimaginative."
---------------------------------------
For unsubscribe and other options, including
the Tip Harvester and archive of TheList go to:
http://lists.evolt.org Workers of the Web, evolt !
More information about the thelist
mailing list