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

时间:2009-09-25 03:59:56

标签: perl home-directory tilde-expansion

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

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

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

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

6 个答案:

答案 0 :(得分:69)

~bash - ism而不是perl - ism,这就是为什么它无效。鉴于您似乎是在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
Yes, it exists!

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

答案 1 :(得分:57)

我不确定每个人都错过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";

答案 2 :(得分:15)

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

答案 3 :(得分:11)

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

答案 4 :(得分:7)

答案 5 :(得分:0)

快进到 2020 年,从 5.31.10 版开始,现在 perl 的核心是一个名为 File::Glob 的模块,用于解析波浪号,例如:

perl -MFile::Glob=":bsd_glob" -lE 'say File::Glob::bsd_glob( "~john" )'

会产生:/home/john

perl -MFile::Glob=":bsd_glob" -lE 'say File::Glob::bsd_glob( "~/some/folder" )'

会产生:/home/jack/some/folder

File::Glob 模块自 perl v5.6 起就存在,但仅与已弃用的 glob 子例程一起使用。