Qual (s) módulo (s) Perl eu uso para obter um caminho absoluto (incluindo o nome do arquivo) de um relativo no Windows?
-
20-09-2019 - |
Pergunta
Só posso imaginar que não estou pesquisando corretamente; Parece uma pergunta óbvia a ser feita aqui. Minhas desculpas se isso é uma duplicata.
Estou escrevendo um programa PERL que assumirá um nome de arquivo como um argumento da linha de comando. Preciso converter o nome do arquivo (ou o nome do arquivo com um caminho relativo anexado) em um caminho absoluto (especificamente para trabalhar com o Win32 :: ole).
Eu tentei usar Cwd'S' ABS_PATH ', e isso quase faz o que eu quero, mas o retorna usando um caminho no estilo Unix em vez de um Win32.
Existe um módulo que converterá o caminho, ou talvez um módulo melhor para usar em primeiro lugar?
Solução
eu uso rel2abs
a partir de Arquivo :: Spec. Você tem que ter cuidado: isso pode ligar getdcwd
a partir de Cwd
, e assumirá que você deseja o diretório de trabalho atual para a unidade atual. Se o arquivo estiver em outra unidade, você precisará corrigi -lo ou fornecer o segundo argumento para definir o caminho base.
Outras dicas
use File::Spec::Functions qw(rel2abs);
print rel2abs($ARGV[0]), "\n";
my($foo) = abs_path($some_file);
$foo =~ s{/}{\\}g;
print "FOO: $foo\n";
Eu uso o ABS_PAT da CWD e depois uso um regex para converter as barras quando eu verdade Precisa fazer. Mas descobri que, para a maioria dos usos, as barras em estilo Unix funcionam muito bem. É apenas para o ocasional "passar um nome de arquivo para esse programa irritantemente limitado" que acabo precisando converter as barras.
use Cwd 'abs_path';
my $path = abs_path($rel_path);
# and only if necessary...
$path =~ s'[/\\]+'\\'g; # use Windows-style slashes
$path =~ s'^\\'\\\\'; # handle network path
Mas então .. eu uso muitos caminhos de rede, com ou sem uma referência de unidade mapeada. Sua milhagem pode variar.