I am trying to use the following perl function, but I am not very clear about three points:
sub inittwiddle {
my ($m,$n,$aref) = @_;
my $i;
$$aref[0] = $n+1;
for ($i=1; $i != $n-$m+1; $i++) {
$$aref[$i] = 0;
}
while($i != $n+1) {
$$aref[$i] = $i+$m-$n;
$i++;
}
$$aref[$n+1] = -2;
$$aref[1] = 1 if ( $m == 0 );
}
First, what does my ($m,$n,$aref) = @_; stand for?
Second, how to understand the $$ for sth like $$aref[0] = $n+1;
And this function was invoked as inittwiddle($M,$N,\@p); what does \@p stand for?
@_is the list of arguments passed to the function. By doingmy ($m,$n,$aref) = @_;you’re assigning$_[0]to$m,$_[1]to$n, and$_[2]to$aref.$arefis a scalar value holding a reference to an array. To refer to elements within the array you can either access them via$aref->[0](this is more idiomatic), or by dereferencing the array reference. By adding a@to the front, you’d refer to the array (i.e.@$aref). However, you want the first element in the array, which is a scalar, so it’s obtained by$$aref[0]. Adding brackets (${$aref}[0]) or using the arrow notation ($aref->[0]) clarifies this a little.\@pis a reference to the array@p. Since your function takes a scalar as the third argument, you have to pass in a scalar.\@pis such. When you pass an array reference into a function like this, it’s important to note that any changes to the array (such as doing$$aref[0] = $n+1) are changes to the original array. If you want to avoid this, you would dereference the array into a temporary one, possibly by doingmy @tmparr = @$aref;within the function.