in reply to return more than 1 value

The subroutine ends with the return-statement. Therefore, in your case the line  return @val; will never be executed.

In order to return more than one value, put all your return-values in a list, array or a hash and return that. The caller of your sub will then need to split the individual return-values ...

HTH, Rata