Pergunta

Eu preciso verificar se um arquivo no diretório home de um usuário existe para verificação de arquivo de uso:

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

Mesmo que haja um arquivo chamado foo.txt no diretório home do usuário, Perl sempre reclama que não existe tal arquivo ou diretório. Quando eu substituir "~" com / home / jimmy (digamos que o usuário é jimmy), em seguida, Perl dar o veredicto direita.

Você poderia explicar por que "~" trabalho dosen't em Perl e me diga o que é a maneira do Perl para encontrar o diretório home do usuário?

Foi útil?

Solução

~ é um bash-ism em vez de um perl-ismo, é por isso que ele não está funcionando. Dado que você parece estar em um sistema do tipo UNIX, provavelmente o mais fácil solução é usar a variável de ambiente $HOME, tais como:

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

E sim, eu sei que o usuário pode alterar sua variável de ambiente $HOME mas então eu diria que eles sabem o que estão fazendo. Se não, eles merecem tudo o que tem: -)

Se você quiser fazê-lo da direito maneira, você pode olhar em File :: HomeDir , que é muito mais plataforma-savvy. Você pode vê-lo em ação na seguinte chkfile.pl script:

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";
}

e transcrição:

pax$ touch ~/foo.txt ; perl chkfile.pl
Yes, it exists!

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

Outras dicas

Eu não tenho certeza que todo mundo perdeu :: HomeDir . É uma daquelas tarefas difíceis que o som fácil, porque ninguém sabe sobre todas as exceções patetas que você tem que pensar. Ele não vem com o Perl, então você precisa instalá-lo sozinho.

Depois de saber o diretório home, construir o caminho que você precisa com File :: Spec :

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

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

Você pode glob o til, glob('~/foo.txt') deve funcionar. Ou você pode usar o File :: Guardar :: Home módulo que deve também cuidar de outros sistemas.

O diretório home para o usuário é armazenado em /etc/passwd. A melhor maneira de chegar à informação é a getpw* funções :

#!/usr/bin/perl 

use strict;
use warnings;

print "uid:", (getpwuid 501)[7], "\n",
    "name:", (getpwnam "cowens")[7], "\n";

Para resolver o seu problema específico, tente este código:

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
   print "yes ,it exists!";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top