2017-09-29 12 views
1

私はperlスクリプトを実装しようとしています。私は実行ファイルのディレクトリを取得する必要があります。Perl `dirname`がフルパスの代わりにドットを出力します

たとえば、私が実行しているファイルがC:\Scripts\MyScript.plにある場合は、C:\Scriptsを取得したいと考えています。

私はdirnameを試しましたが、私がしたいことをしていないようです。それはちょうど私が私が一緒にdirnameabs_pathを使用する必要があることを理解.

を印刷し、それはいくつかのUNIX探してディレクトリを返した後、明らかに最終的に無効なパスで実際のパスでそれを連結しているため、しかしabs_pathは、私にはバグだらけです。

私の概念証明です。

# The initial variable with file 
say $0; # C:\Users\sed\AppData\Roaming\npm\node_modules\my-test-module\my-test-file 

# This is just a current directory 
say dirname($0); # . 

# This looks like a bug to me, the shell is opened in C:/Users/sed so it is related 
say abs_path($0); # /c/Users/sed/C:/Users/sed/AppData/Roaming/npm/node_modules/my-test-module\my-test-file 

# This is what I need, except I don't need that first UNIX looking part 
say dirname(abs_path($0)); # /c/Users/sed/C:/Users/sed/AppData/Roaming/npm/node_modules/my-test-module 
+0

Windows以外のビルドの 'perl'を使っているように見えるとき、' $ 0'はWindowsのパスです。 'perl -v'の最初の行は何ですか? – ikegami

+0

それはWindowsのビルドのようだ。 'これはx86_64-msys-thread-multi用に構築されたperl 5、version 24、subversion 1(v5.24.1)です。 – sed

+1

いいえ、それはmsysビルドであり、Windowsビルドではありません。 msysはUNIXエミュレーション環境です。 (Windowsのビルドは 'x86_64-msys'の代わりに' MSWin32-x64'で始まります)。 – ikegami

答えて

1

あなたがする必要があるもののための最良の選択ではありません。 代わりにFile :: Specを試してください。

C:\Users\Ken> echo C:\Scripts\MyScript.pl | perl -MFile::Spec -lne "print $_; ($v,$d,$f)=File::Spec->splitpath($_); print $v.$d;" 
C:\Scripts\MyScript.pl 
C:\Scripts\ 

タイプ:詳細については、

perldoc File::Spec 

。ところで、私はStrawberry perl v5.24.1でテストしました

+1

これは、 FindBin :: RealBin'または 'dirname(abspath($ 0))'):Unixマシン上の 'C:\ Scripts \ MyScript.pl'に' .'を返します。 'File :: Spec :: Win32'を' File :: Spec :: Win32'に変更すると、( '$ FindBin :: RealBin'や' dirname(abspath($ 0)) 'のようなシンボリックリンクはサポートされません)。 – ikegami

+0

これは実際に働いた!ありがとうございました! – sed

0
use FindBin qw($RealBin); 

say $RealBin; 

一般的な使用:なぜそれがかもしれ

perldoc File::Basename 

を示しています。ざっと見は

use lib $RealBin; 

または

use lib "$RealBin/lib"; 
+0

'$ RealBin;'戻る/ '/ c/Users/sed/c/Users/sed/C:/ Users/sed/AppData/Roaming/npm/node_modules/my-test-module/my-test-file' – sed

+1

あなたはunix-emulation環境で動作する 'perl'にWindowsパスを渡しました。代わりにネイティブ(msys)パスを 'perl'に渡してください。 (明らかにファイルを開くための呼び出しはWindowsパスとネイティブパスの両方を受け付けますが、FindBinで使用される 'abspath'はそれがUNIXマシン上にあると考えてそれに応じて実行します)。 – ikegami