web-dev-qa-db-ja.com

Perlでユーザーのホームディレクトリを見つけるにはどうすればよいですか?

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

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

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

Perlで「〜」が機能しない理由を説明して、ユーザーのホームディレクトリを見つけるPerlの方法を教えてください。

50
Haiyuan Zhang

~bash- ismではなくPerl- ismであるため、機能していません。 UNIXタイプのシステムを使用していると思われる場合、おそらくeasiestソリューションは$HOME環境変数、たとえば:

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

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

rightの方法でやりたい場合は、 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 
いいえ、ありません!
68
paxdiablo

誰もが逃した方法がわからない 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";
57
brian d foy

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

15
zoul

ユーザーのホームディレクトリは/etc/passwdに保存されます。情報を取得する最良の方法は getpw* functions です。

#!/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!";
}
11
Chas. Owens
7
phoebus