我有一个文件夹,名称是:
drwxr-xr-x. 2 user user 4096 Aug 2 18:30 folder name [www.website.com]
但是当我像这样使用glob时:
my @files = glob ("/home/user/Downloads/folder name [www.website.com]/*");
print "@files/n";
它没有列出目录中的文件,结果如下:
/home/user/Downloads/folder name
我试过像这样转义空格和方括号:
/home/user/Downloads/folder\ name\ \[www.website.com\]
但结果是一样的,可能是我的错误或可以做些什么来改善我的代码?
提前致谢
答案 0 :(得分:9)
内置glob
函数在空格处分割模式。所以你正在做一些等同于
my @files = (
glob("/home/user/Downloads/folder"),
glob("name"),
glob("[www.website.com]/*"),
);
转义空格和括号将是一个选项。但最好使用核心File::Glob
module来实现更好的控制:
use File::Glob ':bsd_glob';
my @files = bsd_glob("/home/user/Downloads/folder name \\[www.website.com\\]/*");
现在,只需要转义括号。这也会覆盖内置的glob,所以你实际上不必更改代码,除了那个导入(当然还有模式)。
答案 1 :(得分:1)
Spaces和square brackers在glob模式中很特别。匹配
/home/user/Downloads/folder name [www.website.com]
你需要
/home/user/Downloads/folder\ name\ \[www.website.com\]
所以完整模式是
/home/user/Downloads/folder\ name\ \[www.website.com\]/*
要构建该字符串,您可以使用字符串文字
"/home/user/Downloads/folder\\ name\\ \\[www.website.com\\]/*"
测试:
$ perl -E'say for glob "/home/eric/Downloads/folder\\ name\\ \\[www.website.com\\]/*"'
/home/eric/Downloads/folder name [www.website.com]/foo
请注意,Windows中无法转义空格。你必须使用File :: Glob的bsd_glob
。 (它调用的函数与glob
相同,但标记不同。)
use File::Glob qw( bsd_glob );
say for bsd_glob("C:\\Program Files\\*");