Как найти домашний каталог пользователя в Perl? -- perl поле с участием home-directory поле с участием tilde-expansion пол Связанный проблема

How do I find a user's home directory in Perl?


51
vote

проблема

русский

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

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

Несмотря на то, что есть файл под названием foo.txt в домашнем каталоге пользователя Perl всегда Тело жалуется, что такого файла или каталога нет. Когда я заменяю «~» с помощью / home / jimmy (скажем, пользователь jimmy), то Perl дают правильный вердикт.

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

Английский оригинал

I need to check whether a file in a user's home directory exists so use file check:

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

Even though there is a file called foo.txt under the user's home directory, Perl always complains that there is no such file or directory. When I replace "~" with /home/jimmy (let's say the user is jimmy) then Perl give the right verdict.

Could you explain why "~" dosen't work in Perl and tell me what is Perl's way to find a user's home directory?

</div
        
   
   

Список ответов

74
 
vote
vote
Лучший ответ
 

<Код> ~ - <код> bash - мозма, а не <код> perl "- почему это не работает. Учитывая, что вы, кажется, на системе Unix типа, вероятно, это простое решение является использование $HOME переменная среды, например:

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

И да, я знаю, что пользователь может изменить свой <код> $HOME переменную среды, но я бы предположил, что они знают, что они делают. Если нет, они заслуживают всего, что они получают: -)

Если вы хотите сделать это право право , вы можете посмотреть в Файл :: Homedir , который намного больше платформы - Savvy. Вы можете увидеть его в действии в следующем скрипте <Код> import static org.assertj.core.api.Assertions.assertThatNullPointerException; 0 :

 <код> import static org.assertj.core.api.Assertions.assertThatNullPointerException; 1  

и стенограмма:

. pax $ touch ~ / foo.txt; perl chkfile.pl. Да, это существует!  чел $ гт -rf ~ / foo.txt; perl chkfile.pl. Нет, это не так! 
 

~ is a bash-ism rather than a perl-ism, which is why it's not working. Given that you seem to be on a UNIX-type system, probably the easiest solution is to use the $HOME environment variable, such as:

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

And yes, I know the user can change their $HOME environment variable but then I would assume they know what they're doing. If not, they deserve everything they get :-)

If you want to do it the right way, you can look into File::HomeDir, which is a lot more platform-savvy. You can see it in action in the following script chkfile.pl:

use File::HomeDir; $fileSpec = File::HomeDir->my_home . "/foo.txt"; if ( -e $fileSpec ) {     print "Yes, it exists! "; } else {     print "No, it doesn't! "; } 

and transcript:

 pax$ touch ~/foo.txt ; perl chkfile.pl Yes, it exists!  pax$ rm -rf ~/foo.txt ; perl chkfile.pl No, it doesn't! 
</div
 
 
       
       
58
 
vote

Я не уверен, как все пропустили Файл :: Homedir . Это одна из тех трудовых задач, которые звучат легко, потому что никто не знает обо всех густых исключениях, о которых вы должны думать. Это не приходит с Perl, поэтому вам нужно установить его самостоятельно.

Как только вы знаете домашний каталог, постройте путь, который вам нужен с file :: spec :

 <код> import static org.assertj.core.api.Assertions.assertThatNullPointerException; 2  
 

I'm not sure how everyone missed File::HomeDir. It's one of those hard tasks that sound easy because no one knows about all of the goofy exceptions you have to think about. It doesn't come with Perl, so you need to install it yourself.

Once you know the home directory, construct the path that you need with File::Spec:

 use File::HomeDir qw(home);  use File::Spec::Functions qw(catfile);   print "The path is ", catfile( home(), 'foo.txt' ), " "; 
</div
 
 
 
 
18
 
vote

Вы можете ГЛОГ Tille, <Код> import static org.assertj.core.api.Assertions.assertThatNullPointerException; 3 должен работать Отказ Или вы можете использовать Файл :: Сохранить :: Home Модуль, который должен Также позаботьтесь о других системах.

 

You can glob the tilde, glob('~/foo.txt') should work. Or you can use the File::Save::Home module that should also take care of other systems.

</div
 
 
     
     
11
 
vote

Домашний каталог для пользователя хранится в /etc/passwd . Лучший способ получить информацию о информации - <Код> getpw* Функции :

 <код> #!/usr/bin/perl   use strict; use warnings;  print "uid:", (getpwuid 501)[7], " ",     "name:", (getpwnam "cowens")[7], " ";   

Чтобы решить вашу конкретную проблему, попробуйте этот код:

 <код> if ( -e (getpwuid $>)[7] . "/foo.txt" ) {    print "yes ,it exists!"; }   
 

The home directory for a user is stored in /etc/passwd. The best way to get at the information is the getpw* functions:

#!/usr/bin/perl   use strict; use warnings;  print "uid:", (getpwuid 501)[7], " ",     "name:", (getpwnam "cowens")[7], " "; 

To address your specific problem, try this code:

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {    print "yes ,it exists!"; } 
</div
 
 
 
 
7
 
vote

попробуйте <код> File::Path::Expand .

.
 

Try File::Path::Expand.

</div
 
 

Связанный проблема

2  Перл Как распечатать хеш с несколькими ключами?  ( Perl how to print out a hash with multiple keys ) 
Я устанавливаю свой хэш в моей функции как <код> $hash{$loginId}{$month}=$hash{$loginId}{$month}+$time1; И я могу распечатать значение в одном месте как...

1  Как мне позвонить сценарий Perl с моим контроллером Symfony2?  ( How do i call a perl script from my symfony2 controller ) 
Я пытаюсь реализовать автоматическую отправку в систему управления информацией из-за моего приложения Symfony2. Кто-то еще написал сценарий Perl для представл...

0  Командная строка для использования Perl Script на нескольких файлах  ( Command line for using perl script on multiple files ) 
Сценарий Perl, данный мне, содержит: <код> yaml4 В начале и должен быть запущен на нескольких файлах FastQ. Я не уверен, какую командную строку использов...

3  Как я могу использовать Perl для проверки программ C?  ( How can i use perl to test c programs ) 
Я ищу некоторые учебные пособия, показывающие, как я могу проверить программы C, написав программы Perl для автоматизации тестирования. В основном я хочу из...

19  Как я могу получить простоту PHP (развертывание), но мощность Perl?  ( How can i get phps deployment simplicity but perls power ) 
Я презираю язык PHP, и я совершенно уверен, что я не одинок. Но великая вещь о PHP - это способ, которым mod_php принимает и скрывает детали образования горы ...

2  Как сделать переводчик Mod_Perl Sticky по некоторым конвенциям?  ( How to make a mod perl interpreter sticky by some conventions ) 
Как кажется, что mod_perl только удается Perl Переводчики на VHOST Есть любой способ, которым я могу влиять, какой клонированный переводчик MOD_PERL Выбирае...

0  Импорт свободно структурированных данных в базу данных  ( Importing loosely structured data into database ) 
Я получаю ежедневные каналы передачи данных с данными, которые просто структурированы. Мне нужно импортировать его в базу данных, поэтому я могу запустить отч...

4  Невозможно получить работу стада Perl  ( Unable to get perls flock working ) 
Я не могу сделать Perl's <код> flock Работа. Я блокирую файл, проверяя возврат, чтобы убедиться, что он на самом деле заблокирован, и я все еще могу открыт...

4  Как «сериализовать» и «десериализация» аргументы командной строки в / из строки?  ( How to serialize and deserialize command line arguments to from string ) 
Я называю моим сценарием: <код> $ ./script 'a!#*`*& ^$' "sdf sdf"qw sdsdf" 1 -- 2 3 Это получает аргументы: <код> 1: a!#*`*& ^$ 2: sdf sdf"qw sdsdf 3:...

4  ДБИ :: Реализация CSV на основе SQLite  ( Dbicsv implementation based on sqlite ) 
У меня много текстовых файлов, сравнивая друг друга в «SQL манере». <Код> DBD::CSV , очевидно, хороший выбор, чтобы начать, так как я могу использовать синт...

3  Ищите функцию, не работающие в Perl  ( Seek function not working in perl ) 
Я попробовал ниже фрагмент кода, и функция поиска, похоже, не работает. <код> funct("ls -ltr /scratch/dummy/dum*"); sub funct { print " Recording "; open(...

3  Perl: Как распечатать следующую строку после сопоставления шаблона?  ( Perl how to print next line after matching a pattern ) 
Я хотел бы распечатать определенные данные после сопоставления шаблона или строки. У меня есть такой файл: <код> #****************************** List : ...

0  Проблема Regex Perl, последний символ усеченный  ( Perl regex issue last character truncated ) 
имеют странную проблему с моим регелем. Мое регулярное выражение сокращает последний символ, в приведенном ниже примере его следует вернуть значение 32, но ...

0  Заменив хеш-имя со скалярным в Perl  ( Replacing hash name with scalar in perl ) 
У меня есть хэш: <код> my $normal_hash = {a => '10',}; print $normal_hash; # prints HASH(0x......) Я хочу обратиться к этому хэш следующим образом: <...

1  Одинокий Perl Regex для удаления сбежал Ampersands изнутри атрибутов Href, но не других  ( Single perl regex for removing escaped ampersands from inside href attributes bu ) 
Это больше вопрос головоломки для моего любопытства, чем что-либо еще. Я ищу единую замену регулярного выражения выражения, которые будут конвертировать сущно...

Связанный проблема

2  Перл Как распечатать хеш с несколькими ключами? 
1  Как мне позвонить сценарий Perl с моим контроллером Symfony2? 
0  Командная строка для использования Perl Script на нескольких файлах 
3  Как я могу использовать Perl для проверки программ C? 
19  Как я могу получить простоту PHP (развертывание), но мощность Perl? 
2  Как сделать переводчик Mod_Perl Sticky по некоторым конвенциям? 
0  Импорт свободно структурированных данных в базу данных 
4  Невозможно получить работу стада Perl 
4  Как «сериализовать» и «десериализация» аргументы командной строки в / из строки? 
4  ДБИ :: Реализация CSV на основе SQLite 
3  Ищите функцию, не работающие в Perl 
3  Perl: Как распечатать следующую строку после сопоставления шаблона? 
0  Проблема Regex Perl, последний символ усеченный 
0  Заменив хеш-имя со скалярным в Perl 
1  Одинокий Perl Regex для удаления сбежал Ampersands изнутри атрибутов Href, но не других