Como posso fazer Perl reconhecer caminhos com '~'?
-
27-09-2019 - |
Pergunta
Possível duplicata:
Como encontro o diretório doméstico de um usuário em Perl?
Estou executando o Ubuntu.
Sempre que passo a um script perl um caminho que começa com ~
(por exemplo: ~/Documents/file.txt
) Falha em encontrá -lo. Devo passar no caminho canônico (por exemplo /home/dave/Documents/file.txt
).
Por que é que?
Posso fazer Perl reconhecer ~
caminhos?
ATUALIZAR
Todas as soluções sugeridas incluem alterar o código nos scripts. Eu gostaria de uma solução que não envolveria nenhuma alteração nos próprios scripts (já que nem todos eles são meus). Talvez algo na maneira como o Bash funciona?
A versão atualizada da pergunta foi postado no super usuário.
Solução
Para um método confiável (e fácil) de plataforma cruzada, tente Arquivo :: Homedir:
use File::HomeDir;
print File::HomeDir->my_home;
Outras dicas
Você pode passar o caminho para glob
Para expandi -lo.
o glob A função entende o Globbing de arquivos Unix padrão.
my $file = glob('~/Documents/file.txt');
Do comentário de Bruno, você pode fazer da seguinte maneira:
$path =~ s/^~(\w*)/ ( getpwnam( $1 || $ENV{USER} ))[7] /e;
o e
A bandeira substitui a expressão pelo resultado do executando ou avaliação a expressão de substituição.
Use-citações de ângulo, e não duas ditas:
open(my $fh, "< :crlf :encoding(cp1252)",
<~/Documents/file.txt>)
|| die "couldn't open Winblose text file ~/Documents/file.txt: $!";
o <xxx>
operador de iteração, que as pessoas geralmente consideram açúcar sintático para o readline
função, em vez disso, chama o glob
função se houver metachars de shell em xxx, e Tilde conta como um desses.
Você pode preferir um modo aberto de <:encoding(Latin1)
. Depende apenas do arquivo.
Tente substituir ~
com $ENV{HOME}