call_dir($p=1) ... sub call_dir { if ($p == 1) ...

would be better as:

call_dir(1) ... sub call_dir { my ($p) = @_; if ($p == 1)