如何在Perl中find用户的主目录?

我需要检查一个用户的主目录中的文件是否存在,所以使用文件检查:

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

即使在用户的主目录下有一个名为foo.txt的文件,Perl总是抱怨没有这样的文件或目录。 当我用/ home / jimmyreplace“〜”(假设用户是jimmy),Perl给出正确的判决。

你能解释为什么“〜”不能在Perl中工作,并告诉我什么是Perl的方式来find用户的主目录?

~是一种bash主义而不是一种外来主义,这就是为什么它不起作用。 鉴于您似乎在UNIXtypes的系统上,可能最简单的解决scheme是使用$HOME环境variables,如:

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

是的,我知道用户可以更改他们的$HOME环境variables,但是我会假设他们知道他们在做什么。 如果没有,他们应得的一切,他们得到:-)

如果你想以正确的方式做,你可以看看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
不,不是!

我不确定每个人都错过了File :: HomeDir 。 这听起来很容易,因为没有人知道你必须思考的所有愚蠢的例外。 它不会与Perl,所以你需要自己安装它。

一旦你知道了主目录,用File :: Spec构build你需要的path:

  use File::HomeDir qw(home); use File::Spec::Functions qw(catfile); print "The path is ", catfile( home(), 'foo.txt' ), "\n"; 

你可以使用代字号, glob('~/foo.txt')应该可以工作。 或者你可以使用File :: Save :: Home模块来处理其他系统。

用户的主目录存储在/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!"; } 

尝试File::Path::Expand