Какие модули Perl я использую для получения абсолютного пути (включая имя файла) из относительного пути в Windows?
-
20-09-2019 - |
Вопрос
Я могу только предположить, что я неправильно ищу;это кажется очевидным вопросом, который следует задать здесь.Приношу свои извинения, если это дубликат.
Я пишу программу на Perl, которая будет принимать имя файла в качестве аргумента командной строки.Мне нужно преобразовать имя файла (или имя файла с привязанным относительным путем) в абсолютный путь (специально для работы с Win32::OLE).
Я пробовал использовать Ухо's 'abs_path' , и это почти делает то, что я хочу, но возвращает его, используя путь в стиле Unix вместо пути Win32.
Есть ли модуль, который преобразует путь, или, возможно, лучший модуль для использования в первую очередь?
Решение
Я использую rel2abs
От Файл::Спецификация.Но ты должен быть осторожен:это могло бы вызвать getdcwd
От Cwd
, и это будет предполагать, что вам нужен текущий рабочий каталог для текущего диска.Если файл находится на каком-либо другом диске, вам придется исправить это самостоятельно или указать второй аргумент для задания базового пути.
Другие советы
use File::Spec::Functions qw(rel2abs);
print rel2abs($ARGV[0]), "\n";
my($foo) = abs_path($some_file);
$foo =~ s{/}{\\}g;
print "FOO: $foo\n";
Я использую abs_path Cwd, а затем использую регулярное выражение для преобразования косых черт, когда я действительно нужно это сделать.Но я обнаружил, что для большинства применений косые черты в стиле Unix работают просто отлично.Только для случайного "передачи имени файла в эту раздражающе ограниченную программу" мне в конечном итоге приходится преобразовывать косые черты.
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
Но потом..Я использую множество сетевых путей, с привязкой к подключенному диску или без нее.Ваш пробег может отличаться.