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!
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模块,该模块也应该处理其他系统.
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)
| 归档时间: |
|
| 查看次数: |
42235 次 |
| 最近记录: |