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

Hai*_*ang 50 perl tilde-expansion home-directory

我需要检查用户主目录中的文件是否存在,因此请使用文件检查:

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

即使在用户的主目录下有一个名为foo.txt的文件,Perl总是抱怨没有这样的文件或目录.当我用/ home/jimmy替换"〜"时(让我们说用户是jimmy)然后Perl做出正确的判决.

你能解释为什么"〜"不能在Perl中工作并告诉我Perl找到用户主目录的方式是什么?

pax*_*blo 69

~是一种bash主义而不是一种perl主义,这就是为什么它不起作用.鉴于您似乎是在UNIX类型的系统上,可能最简单的解决方案是使用$HOME环境变量,例如:

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

是的,我知道用户可以更改他们的$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";
}
Run Code Online (Sandbox Code Playgroud)

和成绩单:

pax$ touch ~/foo.txt ; perl chkfile.pl
Yes, it exists!

pax$ rm -rf ~/foo.txt ; perl chkfile.pl
No, it doesn't!

  • 这有几个问题:并非所有会话都有HOME集,并不是所有系统都构建像unix这样的路径.File :: HomeDir将为您提供正确的答案. (10认同)
  • 永远不要假设你不需要的时候.有用的程序往往会迁移.:) (8认同)

bri*_*foy 58

我不确定每个人都错过了File :: HomeDir.这是一项难以理解的艰巨任务之一,因为没有人知道你必须考虑的所有愚蠢的例外.它没有Perl,所以你需要自己安装它.

一旦你知道了主目录,用File :: Spec构建你需要的路径:

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

 print "The path is ", catfile( home(), 'foo.txt' ), "\n";
Run Code Online (Sandbox Code Playgroud)


zou*_*oul 15

您可以glob的波浪,glob('~/foo.txt')应该工作.或者您可以使用File :: Save :: Home模块,该模块也应该处理其他系统.

  • 为什么选择downvote?这两种方法都有效.如果他们有问题,我想知道. (6认同)

Cha*_*ens 11

用户的主目录存储在/etc/passwd.获取信息的最佳方式是getpw*功能:

#!/usr/bin/perl 

use strict;
use warnings;

print "uid:", (getpwuid 501)[7], "\n",
    "name:", (getpwnam "cowens")[7], "\n";
Run Code Online (Sandbox Code Playgroud)

要解决您的特定问题,请尝试以下代码:

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
   print "yes ,it exists!";
}
Run Code Online (Sandbox Code Playgroud)

  • File::HomeDir 不是核心模块,因此如果您不想添加依赖项,这可能是一个不错的选择。 (2认同)