Как я могу исправить путь к файлу для конкретной ОС в Perl? - PullRequest
1 голос
/ 12 октября 2010

Из-за испорченного устаревшего кода

у меня есть

$path = [OS specific base DIR name][hardcoded Linux file path]

Так что в Linux это что-то вроде

$path = /common/path/to/dir/pathtofile/name.extension

, но в Windows этоthis

$path = C:\path\to\dir\pathtofile/name.extension

Некоторая часть кода не работает в Windows, поскольку она ожидает \, в то время как она получает /.

Есть ли функция Perl, которая может помочья здесь?

Что-то вроде

print "$path\n";
$path = <some function> $path;
print "$path\n";

C:\path\to\dir\pathtofile/name.extension
C:\path\to\dir\pathtofile\name.extension

Ответы [ 3 ]

6 голосов
/ 12 октября 2010

Семейство модулей File::Spec существует именно по этой причине.Возможно, вы захотите использовать это вместо жесткого кодирования путей Unix.

use File::Spec::Functions 'catfile';

my $path = catfile($os_specific_base_dir, 'pathtofile', 'name.extension');

Если вам действительно нужно где-то жестко кодировать пути Unix, что на самом деле не кажется хорошей идеей, вам, вероятно, следует использовать File::Spec::Unixразделить путь на его компоненты, а затем использовать вариант File::Spec, собственный для вашей целевой системы, чтобы собрать компоненты снова вместе.

1 голос
/ 12 октября 2010

Вы смотрели на File :: Spec основные модули - и связанные с ними?

0 голосов
/ 14 октября 2010

Звучит так, будто вы получаете весь путь $, переданный вам откуда-то еще как единое целое, а не роскошь иметь дело с кусочками по отдельности.В этом случае я не вижу лучшего ответа, чем уродливое решение заменить все косые черты обратными косыми чертами, если мы работаем под Windows.

Следующее должно делать то, что вам нужно:

if ($^O =~ /^MSWin/) {
    $path =~ s{/}{\\}g;
}

РЕДАКТИРОВАТЬ : Подумав еще раз - взглянув на File :: Spec, похоже, вам нужна функция canonpath:

use File::Spec;
# ...
$path = File::Spec->canonpath($path);
...