Perl использует File :: Spec для удаления .. и.с пути - PullRequest
1 голос
/ 05 января 2012

Я использую File :: Spec в системе Unix, чтобы получить абсолютный путь к файлу:

use File::Spec::Functions qw(:ALL);
use strict;
use warnings;
use feature qw(say);

my $file = "../../this/is/a/test";

say rel2abs($file);

Это распечатывает /directory/to/program/../../this/is/a/test.Я бы хотел, чтобы он распечатал /directory/this/is/a/test.

Я видел метод no_upwards, и вот описание:

Given a list of file names, strip out those that refer to a parent directory.
(Does not strip symlinks, only '.', '..', and equivalents.)

     @paths = File::Spec->no_upwards( @paths );

Однако, похоже, это не сработало.Вместо этого я посмотрел код в модуле File :: Spec и обнаружил:

sub no_upwards {
    my $self = shift;
    return grep(!/^\.{1,2}\z/s, @_);
}

Итак, что делает этот метод и как мне заставить его работать?

Если я правильно понял, это берет список каталогов, а затем удаляет все те каталоги, которые . или ...(Согласно Perldoc \z означает, что соответствует только в конце строки ).

Существует ли независимый от платформы способ свертыванияэти специальные каталоги?Что должен делать no_upwards и как вы его используете?Я попытался:

 say no_upwards(rel2abs($file));

Есть ли другой метод, который я должен использовать?

Ответы [ 2 ]

8 голосов
/ 05 января 2012

В документации для canonpath в File :: Spec написано:

Методы

canonpath

Никакой физической проверки файловой системы, но логическая очистка пути.

$cpath = File::Spec->canonpath( $path ) ;

Обратите внимание, что это не свертывание x/../y разделов в y. Это по дизайну. Если /foo в вашей системе является символической ссылкой на /bar/baz, то /foo/../quux на самом деле /bar/quux, а не /quux как наивный ../ -удаленный даст вам. Если вы хотите сделать этот вид обработки, вы вероятно, нужно, чтобы функция Cwd realpath () фактически проходила файловая система очищает пути, как это.

Так что я хотел бы изучить использование функции Cwd realpath () , как сказано.

2 голосов
/ 05 января 2012

Чтобы ответить на ваш вопрос

Итак, что делает этот метод и как мне заставить его работать?

, когда вы ls -a на своем терминале, это даст вам что-то вроде. .. some_folder some_file.txt another_file.txt

no_upwards() просто удаляет . и .. и возвращает списокsome_folder some_file.txt another_file.txt

...