in reply to STDIN question

You can use typeglobs:
use strict; print myslurp(); sub myslurp { if(shift){ open(F,"<$_") or die "Can't open $_: $!"; }else{ F=*STDIN{IO}; } local $/=undef; my $slurp=<F>; close(F); $slurp; }