我有两个目录,其中有源和目标
例如,
/nfs/edu/lib/etc/sim/win
---这是我的目的地/nfs/edu/lib/etc/ket/ops/nis
----这是源文件我已经尝试过Perl的abs2rel
函数来从源代码转换上面的relpath,但是它没有给出确切的答案,而是给了我
../../../../sim/win
-这是我现在得到的输出
my $rel_path = File::Spec->abs2rel( $modules_dir ,$project_dir) ;
项目目录为源,模块目录为目标
我需要创建从源到目标的相对路径。
我的输出应该像../../../sim/win
一样-这是从源到目的地的。
答案 0 :(得分:1)
这就是我认为您的程序是
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: $!";