Alguns antecedentes curtos:
Infelizmente, a API do Unix não fornece um programa em execução com o caminho completo para o executável. De fato, o programa que executa o seu pode fornecer o que ele deseja no campo que normalmente informa ao seu programa o que é. Como todas as respostas apontam, existem várias heurísticas para encontrar possíveis candidatos. Mas nada menos que pesquisar em todo o sistema de arquivos sempre funcionará, e mesmo isso falhará se o executável for movido ou removido.
Mas você não deseja o executável Perl, que é o que está realmente sendo executado, mas o script que está sendo executado. E o Perl precisa saber onde o script está. Ele armazena isso __FILE__
enquanto $0
é da API Unix. Ainda pode ser um caminho relativo, então pegue a sugestão de Mark e canonize-a comFile::Spec->rel2abs( __FILE__ );