sub my_subroutine{ my $val1 = @_; ... }とやってしまい、$val1が "1" となってしまった。
sub my_subroutine{ my ($val1) = @_; ... }このようにしなければならない。@_ は、配列だからである。配列を、カッコで括った複数の変数に代入すると、その変数の数だけの配列がコピーされる。
上記の例は、配列の最初の要素を、$val1にコピーしているのである。基本的なことだけど。最初の $val1 = @_ とやると、配列 @_ の要素数が入るのかな。だから1になった。