my $stdin = IO::Select->new(\*STDIN); open my $fh, '|-', $cmd or die $!; if (@ARGV || $stdin->can_read(0)) { while (<>) { print {$fh} $_ or die $!; } } else { print {$fh} "\n" or die $!; } close $fh or die $!;