2015-05-05 30 views
8

Szukałem w skutecznych sposobów do odczytu plików w Perl i natknąłem się na to bardzo interesująca Wkład:Fancy plik slurping w Perlu

my $text = do { local (@ARGV, $/) = $file; <> }; 

Moje pytanie brzmi: Jak dokładnie to działa? Zwykle podczas slurowania pliku ustawionego na $/ = undef, ale nie widzę, jak to robi. Ten mały kawałek kodu okazuje się bardzo trudny do objęcia głowy.

Jaki byłby uproszczony podział i wyjaśnienie tego?


Teraz, gdy już wiem, jak to działa, poznajmy się naprawdę!

Nie chodzi o to, że ten kod ma jakiekolwiek rzeczywiste zastosowanie; Po prostu fajnie jest rozgryźć i spoko patrzeć. Oto jedna liniówka, która wyśle ​​kilka plików jednocześnie !!!

my @texts = map { local (@ARGV, $/) = $_; <> } @files; 
+1

perl pozwala przypisać wiele zmiennych w jednym zadaniu (nie wiem jak jest poprawnie nazwany): '($ a, $ b, $ c) = (1, 2)'. '$ c' tutaj kończy się' undef' – n0rd

+3

To jest okropne. Musisz zapytać, co robi, więc nie duplikuj go. – Borodin

+1

Ta linia kodu wydaje się być powszechnie używanym fragmentem kodu Perla. Widziałem to w więcej niż jednym miejscu, co skłoniło mnie do zadawania tego pytania. – tjwrona1992

Odpowiedz

10
local (@ARGV, $/) = $file; 

jest taka sama jak

local @ARGV = ($file); 
local $/ = undef; 

<> odczytuje z plików zawartych w @ARGV, to znaczy z $file.

+1

Och, to ma sens, wtedy' do {} 'po prostu zwraca to, co wartość ostatniego obliczonego wyrażenia to wartość "<>" lub zawartość pliku. Dzięki @charoba! – tjwrona1992

+0

@ jwrona1992, Celem 'do' jest ograniczenie zakresu, w którym' @ ARGV' i '$ /' są zmieniane. – ikegami