у меня есть два исходных и конечных каталога, мне нужно найти, как создать относительную ссылку от исходного к целевому пути - PullRequest
0 голосов
/ 01 июля 2019

У меня есть два каталога, в которых есть источник и пункт назначения

Например,

  • /nfs/edu/lib/etc/sim/win --- это мой пункт назначения
  • /nfs/edu/lib/etc/ket/ops/nis ---- это источник

Я уже попробовал abs2rel функцию Perl для преобразования вышеуказанного relpath из источника, но он не дает точного ответа, он дает мне ../../../../sim/win -это вывод, который я сейчас получаю

my $rel_path = File::Spec->abs2rel( $modules_dir ,$project_dir) ;

Каталог проекта - это источник, а каталог модуля - это место назначения

Мне нужно создать относительный путь от источника к месту назначения.Мой вывод должен быть как ../../../sim/win - это от источника к месту назначения.

1 Ответ

1 голос
/ 01 июля 2019

Вот что я думаю о вашей программе:

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: $!"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...