2012-08-06 7 views
8
while(<@thisArray>) 

Czy ktoś wie, co to dokładnie zrobiłoby? Byliśmy po prostu o dyskusji na temat tego, jak jest to kod jest zazwyczaj coś takiego:podczas gdy (<@array>) efekty dla perl

while(<STDIN>) 
+0

Nie powinno się nic robić, ponieważ '@ tablica' nie jest nazwą pliku, jest nazwą tablicy. – SexyBeast

Odpowiedz

6

<@thisArray> pracuje jako glob(@thisArray). Tak więc daje listę wszystkich plików pasujących do członków tablicy.

Jeśli element tablicy nie jest zgodny z plikiem, zwracany jest sam element.

10

Powoduje iterację po nazwach plików zgodnych z wzorami w @thisArray.

Wynik perl -MO=Deparse -e '1 while(<@thisArray>)' pokazuje, że <> przekształca się glob:

use File::Glob(); 
'???' while defined($_ = glob(join($", @thisArray))); 

Od glob instrukcji:

W kontekście skalarnym, iteracje glob przez takich rozszerzeń nazw plików, wracając undef gdy lista jest wyczerpany .

Wartość domyślna dla $" jest przestrzeń, dlatego wiele wzorów z @thisArray zostaną połączone w jeden ciąg znaków, a następnie dzielone z powrotem przez przestrzeń wewnątrz glob:

Uwaga że glob dzieli swoje argumenty na spacji i traktuje każdego segment jako oddzielny wzór.

+0

Wielkie dzięki. Używałem go do przeliczenia, więc liczba byłaby odległa. – Psyllex

5

Zobacz perlop:

Jeśli to, co znajduje się wewnątrz nawiasów trójkątnych jest ani filehandle ani prostą zmienną skalarną zawierającą filehandle nazwę, typeglob lub odniesienie typeglob, jest interpretowany jako wzorzec nazwy pliku być globbed

+1

+1 dla linku perlop – DVK