Какие модули Perl я использую для получения абсолютного пути (включая имя файла) от относительного в Windows? - PullRequest
6 голосов
/ 06 октября 2009

Я могу только представить, что я не ищу правильно; это кажется очевидным вопросом, который нужно задать здесь. Приношу свои извинения, если это дубликат.

Я пишу программу на Perl, которая будет принимать имя файла в качестве аргумента командной строки. Мне нужно преобразовать имя файла (или имя файла с присоединенным относительным путем) в абсолютный путь (особенно для работы с Win32 :: OLE).

Я попытался использовать Cwd 'abs_path', и это почти делает то, что я хочу, но он возвращает его, используя путь в стиле Unix вместо Win32.

Есть ли модуль, который преобразует путь, или, возможно, лучше использовать модуль в первую очередь?

Ответы [ 4 ]

13 голосов
/ 07 октября 2009

Я использую rel2abs из Файл :: Spec . Вы должны быть осторожны, хотя: это может вызвать getdcwd из Cwd, и это будет предполагать, что вы хотите текущий рабочий каталог для текущего диска. Если файл находится на каком-либо другом диске, вам придется исправить это самостоятельно или указать второй аргумент, чтобы задать базовый путь.

4 голосов
/ 06 октября 2009
use File::Spec::Functions qw(rel2abs);
print rel2abs($ARGV[0]), "\n";
0 голосов
/ 07 октября 2009

Я использую Cwd's abs_path, а затем использую регулярное выражение для преобразования слешей, когда мне действительно нужно это сделать. Но я обнаружил, что в большинстве случаев слэш в стиле 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

Но тогда .. Я использую много сетевых путей, с или без ссылки на подключенный диск. Ваш пробег может отличаться.

0 голосов
/ 07 октября 2009
my($foo) = abs_path($some_file);
$foo =~ s{/}{\\}g;

print "FOO: $foo\n";
...