2009-06-23 24 views
3

私は「/ホーム/ユーザー/ディレクトリ/私のことを、それを必要とする〜/ DIR/my.pl用すなわちPerlプログラムの絶対パスを相対パスから取得するにはどうすればよいですか?

  • 、私は現在実行しているPerlスクリプトへのフルパスを見つける必要があります.pl "。 $0は私に "〜/ dir/my.pl"を与えます。 ./my.plため

  • は、私はまだ "/home/user/dir/my.pl"

などのおかげが必要になります!

答えて

6

FindBinモジュールを使用します

$ cat /tmp/foo/bar/baz/quux/prog 
#! /usr/bin/perl 

use FindBin; 

print "$FindBin::Bin/$FindBin::Script\n"; 

$ PATH=/tmp/foo/bar/baz/quux prog 
/tmp/foo/bar/baz/quux/prog 

$ cd /tmp/foo/bar/baz/quux 

$ ./prog 
/tmp/foo/bar/baz/quux/prog 
+0

はい、これが私の必要です。ありがとう –

+0

私は空の$ FindBin :: Binを与えているように見える –

+0

あなたのプログラムはどうやっていますか? –

1

パスを絶対値に拡張する必要があるようです。それを行うにはthis articleをチェックしてください。

+0

コールが行われたときの位置(つまりCWD)を知らない限り./my.plを展開することはできません。 –

+0

これはチルダの展開も処理しません。 –

0

使用FindBinモジュール

5

をおrel2abs function in File::Specを探しているように聞こえます。たとえば:

#!/usr/bin/perl 

use File::Spec; 
my $location = File::Spec->rel2abs($0); 
print "$location\n"; 

これは、あなたが説明した方法で$ 0解決します:

$ ./myfile.pl 
/Users/myname/myfile.pl 
$ ~/myfile.pl 
/Users/myname/myfile.pl 

また、あなたは正確に同じ方法でCwd::abs_pathを使用することができます。

+0

残念ながら、それはしません。これは、呼び出しが行われたときと同じディレクトリにいることを意味します。そうかもしれない、そうでないかもしれない –

+0

うーん...いいえ、それは...? '$ export PATH =〜/; cd/tmp /; myfile.pl ' - > /Users/myname/myfile.pl –

+0

複雑なプログラムであるmyfile.plは、呼び出された後でもパスを解決しようとする前にcd-edを持つ可能性があります。その後、./myfile.plとして呼び出された場合、/newdir/myfile.plに解決されます。 –

0

上記の概念の多くは、ファイル自体がシンボリックリンクである場合に破損します。私は通常、次の方法でスクリプトを開始します:

use strict; 
use English; 
use warnings; 

use Cwd qw(realpath); 
use File::Basename; 
use lib &File::Basename::dirname(&Cwd::realpath($PROGRAM_NAME)); 

これがうまくいけばよいと思います。

関連する問題