my @level; &myfunc($number, $company, \@level, 0, $dbh); print $#level; # prints -1 sub myfunc { my ($manager_no, $company_id, $level_ref, $index, $dbh) = @_; my ($employee_no, $emp_company_id); my ($sql, $sth); my @level = @$level_ref; $sql = 'query'; $sth = $dbh->prepare($sql); if ( !($sth->execute($manager_no, $company_id)) ) { die; } while ( ($employee_no, $emp_company_id) = $sth->fetchrow_array() ) { if ( exists $level[$index]{"$employee_no-$emp_company_id"} ) { $level[$index]{"$employee_no-$emp_company_id"} = 1; } else { if ( ( $employee_no eq $manager_no) && ($emp_company_id eq $company_id) ) { # do nothing } else { $level[$index]{"$employee_no-$emp_company_id"} = "$manager_no-$company_id"; &myfunc($employee_no, $emp_company_id, $level_ref, $index + 1, $dbh); } } } }