2015-05-05 23 views
8

stavo guardando in modi efficienti per leggere i file in Perl e sono imbattuto in questo molto interessante uno di linea:file di Fancy slurping in Perl

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

La mia domanda è: Come funziona esattamente questo lavoro? Normalmente quando slurping un file hai impostato $/ = undef, ma non vedo come si fa. Questo piccolo pezzo di codice si sta dimostrando molto difficile da avvolgere.

Quale sarebbe una ripartizione e una spiegazione semplificata per questo?


Ora che so come funziona, siamo davvero fantasiosi!

Non che questo codice abbia un uso reale; è solo divertente da capire e bello da vedere. Ecco un one-liner per estrarre più file contemporaneamente !!!

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

perl consente di assegnare più variabili in un singolo compito (non so come viene chiamato correttamente): '($ a, $ b, $ c) = (1, 2)'. '$ c' qui finirebbe 'undef' – n0rd

+3

Questo è orribile. Devi chiedere che cosa fa, quindi non duplicarlo – Borodin

+1

Questa riga di codice sembra in realtà un pezzo di codice Perl comunemente usato. L'ho visto in più di un posto che è quello che mi ha portato a fare questa domanda. – tjwrona1992

risposta

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

è lo stesso di

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

<> quindi legge dai file di cui @ARGV, vale a dire da $file.

+1

Oh, questo ha senso, quindi il' do {} 'restituisce qualunque sia il il valore dell'ultima espressione valutata è, quale sarebbe il valore di '<>' o il contenuto del file. Grazie @charoba! – tjwrona1992

+0

@ jwrona1992, Il punto di 'do' è limitare l'ambito in cui' @ ARGV' e '$ /' sono cambiati. – ikegami