現在実行中の Perl スクリプトへのフル パスを見つける必要があります。つまり、
~/dir/my.pl の場合、「/home/user/dir/my.pl」にする必要があります。「
$0~/dir/my.pl」が表示されます。./my.pl の場合、「/home/user/dir/my.pl」が必要です。
など ありがとう!
現在実行中の Perl スクリプトへのフル パスを見つける必要があります。つまり、
~/dir/my.pl の場合、「/home/user/dir/my.pl」にする必要があります。「$0~/dir/my.pl」が表示されます。
./my.pl の場合、「/home/user/dir/my.pl」が必要です。
など ありがとう!
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
File::Specでrel2abs関数を探しているようです。例えば:
#!/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を使用することもできます。
FindBinまたはFindBin::Realを見てください。
パスを絶対値に展開するだけでよいようです。その方法については、この記事を確認してください。
FindBinモジュールを使用する
ファイル自体がシンボリック リンクである場合、前述の概念の多くは機能しません。私は通常、次の方法でスクリプトを開始します。
use strict;
use English;
use warnings;
use Cwd qw(realpath);
use File::Basename;
use lib &File::Basename::dirname(&Cwd::realpath($PROGRAM_NAME));
うまくいけば、これが役に立ちます。