2

如何获得perl可执行文件的清理绝对路径但保留符号链接?(从$^X变量或无论如何)

perl 可执行文件示例:

$ ls -l /opt/local/bin/perl
lrwxr-xr-x  1 root  admin  8 18 nov 02:46 /opt/local/bin/perl -> perl5.12

/opt/local/bin/perl无论我如何运行 perl 解释器,我都想进入我的脚本。

测试代码(changesbang.pl):

use strict;
use warnings;
use Cwd;
use File::Spec;
use Config;

my $fmt = "%-25s: %s\n";

printf $fmt, "The value of ^X",        $^X;

printf $fmt, "Cwd::realpath",          Cwd::realpath($^X);
printf $fmt, "Cwd::abs_path",          Cwd::abs_path($^X);

printf $fmt, "File::Spec->cannonpath", File::Spec->canonpath($^X);
printf $fmt, "File::Spec->rel2abs",    File::Spec->rel2abs($^X);

printf $fmt, "Config{perlpath}",       $Config{perlpath};

现在当上面运行时

$ ../../../../../opt/local/bin/perl changesbang.pl
The value of ^X          : ../../../../../opt/local/bin/perl
Cwd::realpath            : /opt/local/bin/perl5.12
Cwd::abs_path            : /opt/local/bin/perl5.12
File::Spec->cannonpath   : ../../../../../opt/local/bin/perl
File::Spec->rel2abs      : /Users/jm/Develop/perl/changesbang/../../../../../opt/local/bin/perl
Config{perlpath}         : /opt/local/bin/perl5.12

没有人把想要的东西还给我/opt/local/bin/perl

问题是:如何通过约束获得想要的 perl 的可执行路径:

  • 应该清理绝对路径
  • 但如果它是符号链接,应该保留它(不要将它更改为它的目标)

Ps:这里有类似这样这样的问题,但没有人给我答案。

4

2 回答 2

2

我建议你试试

use File::Spec::Functions qw( rel2abs canonpath );

print canonpath(rel2abs($^X));

或者,有

use Cwd::Ext 'abs_path_nd';

print abs_path_nd($^X);
于 2013-05-04T09:40:30.843 回答
0

如果不解析符号链接,您的要求是不可能正确完成的。

/a/b/c/d/e/../../../../../opt/local/bin/perl

不一定相同

/opt/local/bin/perl

如果a, b, c,d或中的任何一个e是符号链接。这就是为什么canonpath不改变它。

您正试图在您的程序中引入一个错误。

于 2013-05-04T16:20:59.260 回答