Technisch gesehen ist das korrekt, nur dass 'eval' keine andere Shell aufspaltet. Aus der Sicht der Anwendung, die Sie in der geänderten Umgebung ausführen wollen, ist der Unterschied jedoch gleich Null: Das Kind erbt die Umgebung des Elternteils, so dass die (geänderte) Umgebung an alle nachgeordneten Prozesse weitergegeben wird.
Ipso facto bleibt die geänderte Umgebungsvariable erhalten, solange Sie unter dem übergeordneten Programm/Shell laufen.
Wenn es absolut notwendig ist, dass die Umgebungsvariable bestehen bleibt, nachdem die übergeordnete Shell (Perl oder Shell) beendet wurde, muss die übergeordnete Shell die schwere Arbeit übernehmen. Eine Methode, die ich in der Dokumentation gesehen habe, besteht darin, dass das aktuelle Skript eine ausführbare Datei mit der notwendigen "Export"-Sprache erzeugt und dann die übergeordnete Shell dazu bringt, sie auszuführen - wobei man sich immer der Tatsache bewusst sein muss, dass man dem Befehl "source" voranstellen muss, wenn man versucht, eine nichtflüchtige Version der geänderten Umgebung zu hinterlassen. Bestenfalls eine Kluge.
Die zweite Methode besteht darin, das Skript, das die Shell-Umgebung initiiert (.bashrc oder was auch immer), so zu ändern, dass es den geänderten Parameter enthält. Dies kann gefährlich sein - wenn Sie das Initialisierungsskript vermasseln, kann es dazu führen, dass Ihre Shell beim nächsten Startversuch nicht mehr verfügbar ist. Es gibt viele Werkzeuge, um die aktuelle Shell zu modifizieren; indem Sie die notwendigen Änderungen am "Launcher" vornehmen, schieben Sie diese Änderungen auch nach vorne. Im Allgemeinen ist das keine gute Idee; wenn Sie die Umgebungsänderungen nur für ein bestimmtes Anwendungspaket benötigen, müssen Sie das Shell-Startskript anschließend wieder in seinen ursprünglichen Zustand zurückversetzen (mit vi oder ähnlichem).
Kurz gesagt, es gibt keine guten (und einfachen) Methoden. Vermutlich wurde dies erschwert, um sicherzustellen, dass die Sicherheit des Systems nicht unwiderruflich beeinträchtigt wird.