2013-09-25 16 views
7

Mam folder, jego nazwa to:glob nie rozpoznaje pliku z nawiasami kwadratowymi

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

ale kiedy używam glob tak:

my @files = glob ("/home/user/Downloads/folder name [www.website.com]/*"); 
print "@files/n"; 

nie listę plików w katalog, wynik jest następujący:

/home/user/Downloads/folder name 

próbowałem ucieczki spacje i nawiasy kwadratowe jak to:

/home/user/Downloads/folder\ name\ \[www.website.com\] 

Ale wynik jest taki sam, Jaki może być mój błąd lub Co mogę zrobić, aby poprawić mój kod?

Dzięki z góry

+0

niezwiązane problemu, ale myślę, że chcesz '\ n' w:' print "@files \ n"; ' – toolic

+1

Tak, to mój błąd dziękuję – Davico

Odpowiedz

9

polecenie wbudowane glob funkcja Dzieli wzory na spacji. Tak więc robisz coś, co jest równoważne z

Uciekając białymi znakami i nawiasami, będzie jedna opcja. Ale lepiej jest użyć rdzeń File::Glob module kontroli drobniejszej:

use File::Glob ':bsd_glob'; 

my @files = bsd_glob("/home/user/Downloads/folder name \\[www.website.com\\]/*"); 

Teraz tylko nawiasy muszą być uciekł. Nadpisuje to również wbudowany glob, więc nie musisz zmieniać kodu, z wyjątkiem tego jednego importu (i oczywiście wzorca).

+0

W wersji Perl 5.14, muszę "używać pliku :: Glob": glob '; '. Wygląda na to, że ': bsd_glob' został dodany w 5.16. – toolic

+1

@toolic Z dokumentów: * Zniechęcony tag ': glob' to stara wersja': bsd_glob'. Eksportuje te same stałe i funkcje, ale jego nadpisanie "glob()" nie obsługuje iteracji *, tj. Może powodować nieskończone pętle. Wygląda na to, że ': bsd_glob' został dodany w perl 5.016. Jeśli back-compat jest potrzebny, rozsądne użycie ': glob' wydaje się być właściwym rozwiązaniem. – amon

+0

Ucieczka działa. Ucieczka z kosmosu byłaby łatwiejsza. – ikegami

1

Przestrzenie i kwadratowe nawiasy są specjalne w wzorach globalnych. Aby dopasować

/home/user/Downloads/folder name [www.website.com] 

trzeba

/home/user/Downloads/folder\ name\ \[www.website.com\] 

więc pełny wzór jest

/home/user/Downloads/folder\ name\ \[www.website.com\]/* 

aby zbudować ten ciąg, można użyć ciągu literalnego

"/home/user/Downloads/folder\\ name\\ \\[www.website.com\\]/*" 

test:

$ perl -E'say for glob "/home/eric/Downloads/folder\\ name\\ \\[www.website.com\\]/*"' 
/home/eric/Downloads/folder name [www.website.com]/foo 

Należy pamiętać, że w systemie Windows nie można uciec spacji. Musiałbyś użyć File :: Glob's bsd_glob. (To wywołuje taką samą funkcję jak glob, ale z różnymi flagami.)

use File::Glob qw(bsd_glob); 
say for bsd_glob("C:\\Program Files\\*"); 
Powiązane problemy