53

ユーザーのホーム ディレクトリにファイルが存在するかどうかを確認する必要があるため、ファイル チェックを使用します。

if ( -e "~/foo.txt" ) {
   print "yes, it exists!" ;
}

ユーザーのホームディレクトリの下にfoo.txtというファイルがありますが、Perl は常に、そのようなファイルやディレクトリがないと文句を言います。"~" を/home/jimmyに置き換えると (ユーザーがジミーだとしましょう)、Perl は正しい判断を下します。

"~" が Perl で機能しない理由と、ユーザーのホーム ディレクトリを見つけるための Perl の方法を教えてください。

4

6 に答える 6

78

~bash-ism ではなく-ism でありperl、それが機能しない理由です。UNIX タイプのシステムを使用していると思われる場合、おそらく最も簡単な$HOME解決策は、次のような環境変数を使用することです。

if ( -e $ENV{"HOME"} . "/foo.txt" ) {
    print "yes ,it exists!" ;
}

はい、ユーザーが$HOME環境変数を変更できることは知っていますが、自分が何をしているのかを知っていると思います。そうでない場合、彼らは得るすべてに値します:-)

正しい方法で実行したい場合は、よりプラットフォームに精通したFile::HomeDirを調べることができます。次のスクリプトで動作を確認できますchkfile.pl

use File::HomeDir;
$fileSpec = File::HomeDir->my_home . "/foo.txt";
if ( -e $fileSpec ) {
    print "Yes, it exists!\n";
} else {
    print "No, it doesn't!\n";
}

およびトランスクリプト:

pax$ touch ~/foo.txt ; perl chkfile.pl
はい、存在します!

pax$ rm -rf ~/foo.txt ; perl chkfile.pl
いいえ、そうではありません。
于 2009-09-25T04:03:33.163 に答える
59

誰もがFile::HomeDirを見逃した理由はわかりません。これは、考えなければならない間抜けな例外のすべてを誰も知らないため、簡単に聞こえる難しいタスクの 1 つです。Perl には付属していないので、自分でインストールする必要があります。

ホーム ディレクトリがわかったら、必要なパスをFile::Specで作成します。

 use File::HomeDir qw(home);
 use File::Spec::Functions qw(catfile);

 print "The path is ", catfile( home(), 'foo.txt' ), "\n";
于 2009-09-25T04:53:13.143 に答える
19

チルダをグロブすることができ、glob('~/foo.txt')動作するはずです。または、他のシステムも処理するFile::Save::Homeモジュールを使用できます。

于 2009-09-25T04:34:59.873 に答える
11

ユーザーのホーム ディレクトリは に格納され/etc/passwdます。情報を得る最良の方法はgetpw*関数です:

#!/usr/bin/perl 

use strict;
use warnings;

print "uid:", (getpwuid 501)[7], "\n",
    "name:", (getpwnam "cowens")[7], "\n";

特定の問題に対処するには、次のコードを試してください。

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
   print "yes ,it exists!";
}
于 2009-09-25T04:13:58.697 に答える
7

試してみてくださいFile::Path::Expand

于 2009-09-25T04:03:06.930 に答える