Как найти домашний каталог пользователя в Perl?

Мне нужно проверить, существует ли файл в домашнем каталоге пользователя, поэтому используйте file check:

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

хотя есть файл с именем фу.txt в домашнем каталоге пользователя Perl всегда жалуется, что нет такого файла или каталога. Когда я заменяю " ~ " на /главная/Джимми (допустим, пользователь-Джимми), затем Perl дает правильный вердикт.

Не могли бы вы объяснить, почему " ~ " не работает в Perl и скажите мне, что такое Perl находить домашний каталог пользователя?

5 ответов


~ - это bash-изма, а не 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!

Я не уверен, как все пропустил 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";

вы можете Глоб Тильда, 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.