Não é que o perl não mantenha as aspas, o perl nunca as obtém. As aspas são apenas uma maneira de evitar que o shell divida o texto em vários argumentos. O mesmo efeito pode ser alcançado com barra invertida:
./foo.pl -a one -b two -c 1\ 2\ 3 -d done
O efeito é em ambos os casos uma string de 1, espaço, 2, espaço, 3. Você também pode colocar aspas em torno dos outros argumentos que não contêm espaços, as aspas ainda não fazem parte dos argumentos passados para o programa.
Se você quiser passar argumentos para o shell, você pode simplesmente colocar aspas ao redor de todos. Ou você pode colocar uma barra invertida antes de cada caractere de shell especial.