无法在Windows平台中使用Perl列出包含空间的目录

时间:2011-10-26 03:38:01

标签: perl glob

为了在Windows中列出pathes,我写了下面的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 个答案:

答案 0 :(得分:19)

请尝试bsd_glob

use File::Glob ':glob';
my @list = bsd_glob "$path/*";

答案 1 :(得分:2)

即使主题很久以前已被回答,我最近遇到了同样的问题,快速搜索给了我另一个解决方案,来自perlmonks(最后回复):

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

但更喜欢bsd_glob,它还支持其他一些简洁的功能,例如[]用于字符类。

答案 2 :(得分:1)

问题在于Windows平台,其中Bentoy13的解决方案不起作用,因为反斜杠会被误认为路径分隔符。

如果出于任何原因你不想使用bsd_glob,这是一个选项:用双引号包装路径的攻击性部分。这可以是一个目录名称(path\\"to my"\\file.txt)或多个目录名称("path\\to my"\\file.txt)。斜杠而不是反斜杠通常也有效。当然,他们 不包含空格,所以这里总是有效:

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

记住,这是一个Windows解决方案。它是否在Linux下运行取决于上下文。