[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