Вот что я думаю о вашей программе:
use v5.10;
use File::Spec;
my $modules_dir = "/nfs/edu/lib/etc/sim/win";
my $project_dir = "/nfs/edu/lib/etc/ket/ops/nis";
my $rel_path = File::Spec->abs2rel( $modules_dir, $project_dir );
say $rel_path;
Выход - то, что вы хотите:
../../../sim/win
Однако вы не предоставляете программу, которую вы на самом деле запускаете, поэтому у нас нет никакой надежды увидеть, почему вы получили другой ответ. Всегда публикуйте минимальный, полный и актуальный код, демонстрирующий проблему.
Но я подозреваю, что вы решаете эту проблему неправильно. Как правило, я предпочел бы иметь абсолютные пути вместо относительных. Если я знаю абсолютный путь, я всегда знаю, куда что-то идет. Если у меня есть относительный путь, я также должен знать (и, возможно, постоянно корректировать) текущий рабочий каталог.
Например, в этой программе я могу находиться в любом каталоге, который мне нравится, и все равно переместить файл в нужное место:
use v5.10;
use File::Spec;
my $modules_dir = "/nfs/edu/lib/etc/sim/win";
my $project_dir = "/nfs/edu/lib/etc/ket/ops/nis";
my $file = "some_library.pl";
my $source = File::Spec->catfile( $project_dir, $file );
my $dest = File::Spec->catfile( $modules_dir, $file );
rename $source => $dest or warn "Could not rename file: $!";