I’ve seen some horrific code written in Perl, but I can’t make head nor tail of this one:
select((select(s),$|=1)[0])
It’s in some networking code that we use to communicate with a server and I assume it’s something to do with buffering (since it sets $|).
But I can’t figure out why there’s multiple select calls or the array reference. Can anyone help me out?
It’s a nasty little idiom for setting autoflush on a filehandle other than STDOUT.
select()takes the supplied filehandle and (basically) replaces STDOUT with it, and it returns the old filehandle when it’s done.So
(select($s),$|=1)redirects the filehandle (rememberselectreturns the old one), and sets autoflush ($| = 1). It does this in a list ((...)[0]) and returns the first value (which is the result of theselectcall – the original STDOUT), and then passes that back into anotherselectto reinstate the original STDOUT filehandle. Phew.But now you understand it (well, maybe ;)), do this instead: