2013-09-25 32 views
7

我有一個文件夾識別文件名,它的名字是:水珠不會用方括號

drwxr-xr-x. 2 user user  4096 Aug 2 18:30 folder name [www.website.com] 

但是當我使用的水珠像這樣:

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

完全無關的問題,但我想你想'\ N'在:'打印 「@files的\ n」;' – toolic

+1

是,這是我的錯誤謝謝 – Davico

回答

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,所以你實際上並不需要改變你的代碼,除了那一個導入(當然還有模式)。

+0

在Perl版本5.14上,我需要'使用File :: Glob':glob';'。它看起來像5.16中添加了':bsd_glob'。 – toolic

+1

@toolic來自文檔:*':glob'標籤,現在不鼓勵,是舊版本的':bsd_glob'。它導出相同的常量和函數,但其​​glob()覆蓋不支持迭代*,即可能導致無限循環。看起來':bsd_glob'是在perl 5.016中添加的。如果需要back-compat,明智地使用':glob'似乎是正確的做法。 – amon

+0

逃跑確實奏效。逃離空間會更容易。 – ikegami

1

空間和方括號是特殊的全局模式。爲了配合

/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\\*");