НЕ могу перечислить каталог, включая пространство, используя Perl в платформе Windows - PullRequest
9 голосов
/ 26 октября 2011

Чтобы перечислить пути в Windows, я написал ниже функцию Perl (выполняется в среде выполнения StrawBerry).

sub listpath
{
   my $path = shift;
   my @list = glob "$path/*";
   #my @list = <$path/*>;
   my @pathes = grep {  -d and $_ ne "." and $_ ne ".." } @list;
}

Но он не может правильно проанализировать каталог, включая пространство, например:

Когда я выдал следующий код: listpath ("e: / test / test1 / test11 / test111 / test1111 / test11111 - Copy");

Функция вернула массив, включающий два элемента:

1: e: / test / test1 / test11 / test111 / test1111 / test11111 2: -

Мне интересно, может ли glob анализировать над космическими каталогами. Большое спасибо.

Ответы [ 3 ]

19 голосов
/ 26 октября 2011

Попробуйте bsd_glob вместо:

use File::Glob ':glob';
my @list = bsd_glob "$path/*";
2 голосов
/ 07 мая 2015

Даже если на тему уже давно дан ответ, я недавно столкнулся с той же проблемой, и быстрый поиск дает мне другое решение: perlmonks (последний ответ):

my $path = shift;
$path =~ s/ /\\ /g;
my @list = glob "$path/*";

Но предпочитайте bsd_glob, он поддерживает также несколько других полезных функций, таких как [] для класса символов.

1 голос
/ 16 ноября 2016

Вопрос касается платформы Windows, где решение Bentoy13 не работает, поскольку обратный слеш будет принят за разделитель пути.

Вот вариант, если по какой-либо причине вы не хотите использовать bsd_glob:оберните наступательную часть пути в двойные кавычки.Это может быть одно имя каталога (path\\"to my"\\file.txt) или несколько имен каталогов ("path\\to my"\\file.txt).Слэш вместо обратного слеша тоже обычно работает.Конечно, у них нет для включения пробела, поэтому здесь всегда работает:

my @list = glob "\"$path\"/*";

Помните, это решение для Windows.Работает ли это под Linux, зависит от контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...