2013-05-23 13 views
5

-dフラグの奇妙な動作が気付きました。私のパスに~/my_dirを使用すると、動作が異なります。ディレクトリが〜/ Perlを使用しているかどうか確認してください

ディレクトリmy_dirが存在しても、次のコードはfalseを返しますが、/home/ricky/my_dirのような完全なパスに変更すると、ifステートメントはtrueを返します。

#!/usr/bin/perl -w 
# 
use strict; 

if (-d "~/my_dir") { 
    print "Found \n"; 
} 
else { 
    print "Not found \n"; 
} 

どういう違いがありますか?

+0

参照http://stackoverflow.com/questions/976968/why-does-my-perl-script-fail-on-but-works-with-envhome&http://stackoverflow.com/questions/4043785// – devnull

+0

で '' ls "〜/ mydir" 'を試してみてください - あなたは'違い 'を理解します。 – devnull

+0

ありがとう、これらのソリューションは、私が常に避けようとしている他のモジュールを使用していますが、私はポイントを得ました:) –

答えて

12

~は、ホームディレクトリを示すためにシェルショートカットで、Perl未知です。ここでは、環境変数HOMEを使用する必要があります。たとえば、"$ENV{HOME}/my_dir"を使用します。

+0

BTW、システムを使用してバックティックは〜/私はちょうど見つけた...(シンボリックリンクも同じ問題を抱えている) - 答えに感謝:) –

+0

*システム*にも不明です。 Perlはパスを使って何もしませんが、システムに渡します。 – ikegami

+0

@Rickyこれは、 'system'関数が'/bin/sh'を実行するためです。コマンドラインでシェルの置換を行います。 – aschepler

5

は実際のパスではありません。 /bin/bashなどのシェルは、それを環境変数$HOMEの値に展開します。 Perlはそうではありません。だから、あなたの代わりにこのようなものを使用する必要があります。

if (-d "$ENV{HOME}/my_dir") { 
    ... 
} 
-2

また、chdirコマンドを実行して確認することもできます。 ディレクトリが存在しない場合、chdir "dir_name"は0を返します。ディレクトリが存在する場合は1です。

+1

'-d'は、ディレクトリが存在するかどうかを判断する正しい方法です。 'chdir'はディレクトリに変更するという副作用があります。 'dir_name'がディレクトリであるにもかかわらず、あなたがそれを変更する権限を持っていなければ失敗します。そしてこれは '〜'の使用であるOPの問題に対処していません。 –

関連する問題