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/perlperl インタープリターの実行方法に関係なく、スクリプトを取得したい。

テスト コード (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

abcdまたはのいずれかeがシンボリックリンクである場合。だからこそcanonpath変わらない。

プログラムにバグを導入しようとしています。

于 2013-05-04T16:20:59.260 に答える