⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch4.htm

📁 《Perl 5 Unreleased》
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;18 <BR>

&nbsp;19 $fv = FutureValue();

<BR>

&nbsp;20 <BR>

&nbsp;21 print $fv;<BR>

&nbsp;22 <BR>

&nbsp;23 =cut<BR>

&nbsp;24 <BR>

&nbsp;25 @EXPORT = qw(&nbsp;&nbsp;FutureValue,

<BR>

&nbsp;26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

PresentValue,<BR>

&nbsp;27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

FVofAnnuity,<BR>

&nbsp;28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

AnnuityOfFV,<BR>

&nbsp;29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

getLastAverage,<BR>

&nbsp;30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

getMovingAverage,<BR>

&nbsp;31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

SetInterest);<BR>

&nbsp;32 <BR>

&nbsp;33 #<BR>

&nbsp;34 # Globals, if any<BR>

&nbsp;35 #<BR>

&nbsp;36 <BR>

&nbsp;37 local $defaultInterest

= 5.0;<BR>

&nbsp;38 <BR>

&nbsp;39 sub Finance::SetInterest($)

{<BR>

&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $rate = shift(@_);<BR>

&nbsp;41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$defaultInterest = $rate;<BR>

&nbsp;42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

printf &quot;\n \$defaultInterest = $rate&quot;;<BR>

&nbsp;43 }<BR>

&nbsp;44 <BR>

&nbsp;45 # --------------------------------------------------------------------

<BR>

&nbsp;46 # Notes:<BR>

&nbsp;47 # 1. The interest

rate $r is given in a value of [0-100].<BR>

&nbsp;48 # 2. The $n given in the terms is the rate at which the

interest<BR>

&nbsp;49 #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is

applied.<BR>

&nbsp;50 #<BR>

&nbsp;51 # --------------------------------------------------------------------

<BR>

&nbsp;52 <BR>

&nbsp;53 # --------------------------------------------------------------------

<BR>

&nbsp;54 # Present value of an investment given<BR>

&nbsp;55 # fv - a future

value<BR>

&nbsp;56 # r&nbsp;&nbsp;- rate per period<BR>

&nbsp;57 # n&nbsp;&nbsp;-

number of period<BR>

&nbsp;58 # --------------------------------------------------------------------

<BR>

&nbsp;59 sub Finance::FutureValue($$$)

{<BR>

&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my ($pv,$r,$n) = @_;<BR>

&nbsp;61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $fv = $pv * ((1 + ($r/100)) ** $n);<BR>

&nbsp;62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return $fv;<BR>

&nbsp;63 }<BR>

&nbsp;64 <BR>

&nbsp;65 # --------------------------------------------------------------------

<BR>

&nbsp;66 # Present value of an investment given<BR>

&nbsp;67 # fv - a future

value<BR>

&nbsp;68 # r&nbsp;&nbsp;- rate per period<BR>

&nbsp;69 # n&nbsp;&nbsp;-

number of period<BR>

&nbsp;70 # --------------------------------------------------------------------

<BR>

&nbsp;71 sub Finance::PresentValue($$$)

{<BR>

&nbsp;72&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $pv;<BR>

&nbsp;73&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my ($fv,$r,$n) = @_;<BR>

&nbsp;74&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$pv = $fv / ((1 + ($r/100)) ** $n);<BR>

&nbsp;75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return $pv;<BR>

&nbsp;76 <BR>

&nbsp;77 }<BR>

&nbsp;78 <BR>

&nbsp;79 # --------------------------------------------------------------------

<BR>

&nbsp;80 # Get the future value of an annuity given<BR>

&nbsp;81 # mp - Monthly Payment

of Annuity<BR>

&nbsp;82 # r&nbsp;&nbsp;- rate per period<BR>

&nbsp;83 # n&nbsp;&nbsp;-

number of period<BR>

&nbsp;84 # --------------------------------------------------------------------

<BR>

&nbsp;85 <BR>

&nbsp;86 sub FVofAnnuity($$$) {<BR>

&nbsp;87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $fv;<BR>

&nbsp;88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $oneR;<BR>

&nbsp;89&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my ($mp,$r,$n) = @_;<BR>

&nbsp;90 <BR>

&nbsp;91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$oneR = ( 1 + $r) ** $n;<BR>

&nbsp;92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$fv = $mp * ( ($oneR - 1)/ $r);<BR>

&nbsp;93&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return $fv;<BR>

&nbsp;94 }<BR>

&nbsp;95 <BR>

&nbsp;96 # --------------------------------------------------------------------

<BR>

&nbsp;97 # Get the annuity

from the following bits of information<BR>

&nbsp;98 # r&nbsp;&nbsp;- rate per period<BR>

&nbsp;99 # n&nbsp;&nbsp;-

number of period<BR>

100 # fv - Future Value<BR>

101 # --------------------------------------------------------------------

<BR>

102 <BR>

103 sub AnnuityOfFV($$$) {<BR>

104&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $mp; # mp - Monthly Payment of Annuity<BR>

105&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $oneR;<BR>

106&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my ($fv,$r,$n) = @_;<BR>

107 <BR>

108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$oneR = ( 1 + $r) ** $n;<BR>

109&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$mp = $fv * ( $r/ ($oneR - 1));<BR>

110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return $mp;<BR>

111 }<BR>

112 <BR>

113 # --------------------------------------------------------------------

<BR>

114 # Get the average of the last &quot;n&quot; values in an array.

<BR>

115 # --------------------------------------------------------------------

<BR>

116 # The last $count number of elements from the array in @values

<BR>

117 # The total number of elements in @values is in $number<BR>

118 #<BR>

119 sub getLastAverage($$@) {<BR>

120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my ($count, $number, @values) =&nbsp;&nbsp;@_;<BR>

121&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $i;<BR>

122 <BR>

123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $a = 0;<BR>

124&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return 0 if ($count == 0);<BR>

125&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

for ($i&nbsp;&nbsp;&nbsp;&nbsp; = 0; $i&lt; $count; $i++) {<BR>

126&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$a += $values[$number - $i - 1];<BR>

127&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}<BR>

128&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return $a / $count;<BR>

129&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}<BR>

130 <BR>

131 # --------------------------------------------------------------------

<BR>

132 # Get a moving average of the values.<BR>

133 # --------------------------------------------------------------------

<BR>

134 # The window size is the first parameter, the number of items

in the<BR>

135 # passed array is next. (This can easily be calculated within

the<BR>

136 # function using the scalar() function, but the subroutine

shown here<BR>

137 # is also being used to illustrate how to pass pointers.)

The reference to the<BR>

138 # array of values is passed next, followed by a reference

to the place<BR>

139 # the return values are to be stored.<BR>

140 #<BR>

141 sub getMovingAve($$\@\@) {<BR>

142&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my ($count, $number, $values, $movingAve) =&nbsp;&nbsp;@_;<BR>

143&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $i;<BR>

144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $a = 0;<BR>

145&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

my $v = 0;<BR>

146 <BR>

147&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return 0 if ($count == 0);<BR>

148&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return -1 if ($count &gt; $number);<BR>

149&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return -2 if ($count &lt; 2);<BR>

150 <BR>

151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$$movingAve[0] = 0;<BR>

152&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$$movingAve[$number - 1] = 0;<BR>

153&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

for ($i=0; $i&lt;$count;$i++) {<BR>

154&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$v = $$values[$i];<BR>

155&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$a += $v / $count;<BR>

156&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$$movingAve[$i] = 0;<BR>

157&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}<BR>

158&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

for ($i=$count; $i&lt;$number;$i++) {<BR>

159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$v = $$values[$i];<BR>

160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$a += $v / $count;<BR>

161&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$v = $$values[$i - $count - 1];<BR>

162&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$a -= $v / $count;<BR>

163&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

$$movingAve[$i] = $a;<BR>

164&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}<BR>

165&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0;<BR>

166&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}<BR>

167 <BR>

168 1;</FONT></TT>

</BLOCKQUOTE>

<HR>

<P>

Look at the declaration of the function <TT><FONT FACE="Courier">FutureValue</FONT></TT>

with <TT><FONT FACE="Courier">($$$)</FONT></TT>. The three dollar

signs together signify three scalar numbers being passed into

the function. This extra scoping is present for validating the

type of the parameters passed into the function. If you were to

pass a string instead of a number into the function, you would

get a message very similar to this one:

<BLOCKQUOTE>

<TT><FONT FACE="Courier">Too many arguments for Finance::FutureValue

at ./f4.pl line 15, near &quot;$time)&quot;<BR>

Execution of ./f4.pl aborted due to compilation errors.</FONT></TT>

</BLOCKQUOTE>

<P>

The use of prototypes when defining functions prevents you from

sending in values other than what the function expects. Use <TT><FONT FACE="Courier">@</FONT></TT>

or <TT><FONT FACE="Courier">%</FONT></TT> to pass in an array

of values. If you are passing by reference, use <TT><FONT FACE="Courier">\@</FONT></TT>

or <TT><FONT FACE="Courier">\%</FONT></TT> to show a scalar reference

to an array or hash, respectively. If you do not use the backslash,

all other types in the argument list prototype are ignored. Other

types of disqualifiers include an ampersand for a reference to

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -