Your array assignment is eating up all the parameters.
For example, in the following, $foo and $bar will always be undefined, and @array will contain 4 elements:
my (@array, $foo, $bar) = (1,2,3,4);
Here are two potential solutions:
1) Put scalars first, and then your array:
sub mean {
my ($chan1, $chan2, $chan3, $chan4, @values) = @_;
print $chan1, $chan2, $chan3, $chan4;
my $ave_value = sum(@values[$chan1, $chan2, $chan3, $chan4])/@values;
}
# Calling method:
mean($subchannel[0], $subchannel[1], $subchannel[2], $subchannel[3], @datachunk)
2) Alternatively, you can pass the array by reference:
sub mean {
my ($arrayref, $chan1, $chan2, $chan3, $chan4) = @_;
print $chan1, $chan2, $chan3, $chan4;
my $ave_value = sum(@{$arrayref}[$chan1, $chan2, $chan3, $chan4]) / @$arrayref;
}
# Calling method:
mean(\@datachunk, $subchannel[0], $subchannel[1], $subchannel[2], $subchannel[3])
However, the tightest solution is to restyle your code. All you want is the average of a list. Therefore, just pass a list directly instead of the array with index values.
sub mean {
return @_ ? sum(@_) / @_ : die "Mean of 0 numbers is undefined";
}
# Calling method:
mean(@datachunk[@subchannel[0..3]])