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

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

即使有一个文件叫 foo.txt 根据用户的录,Perl总是 抱怨说,没有这样的文件或录。当我取代"~"与 /home/吉米 (让我们所说的用户是吉米)然后Perl得到正确的判决。

你能解释为什么"~"不工作在Perl告诉我什么是Perl的方式 找到一个用户家庭的目录?

有帮助吗?

解决方案

~ 是一个 bash-ism而不是一个 perl-ism,这就是为什么它不工作。鉴于你似乎是在UNIX型系统,可能的 最简单的 解决办法是使用 $HOME 环境变量,例如:

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

是的,我知道的用户可以改变他们 $HOME 环境变量,但然后我假设他们知道他们在做什么。如果不,他们应该得到一切,他们得到:-)

如果你想要做的 种方式,可以看到 文件::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!

其他提示

我不知道该怎么每个人都错过了 文件::HomeDir.这是一个艰巨的任务,这听起来很容易因为没有人知道所有的愚蠢的例外情况,你要想想.它不来Perl,所以你需要自己安装。

一旦你知道的家庭目录,建造道路,你需要的 文件::格:

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

 print "The path is ", catfile( home(), 'foo.txt' ), "\n";

你可以 glob 符, glob('~/foo.txt') 应工作。或者您可以使用 文件:保存::回家 模块也应该照顾的其他系统。

主目录的用户是储存在 /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!";
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top