I don't know if this won't work for some reason, but why not:
my @f;
while ( $_ = scalar @f ? shift @f : <STDIN> ) {
chomp;
unshift(@f,"hi test test") if condition;
}
If you won't be shifting '0' or '', then even
$_ = shift @f || <STDIN> works. Both solutions are simpler than tie()-ing STDIN; just replace reads from STDIN to
shift @f || <STDIN> inside the loop for seamless transition. Becase I'm a fan of using a block, instead of while syntax, with longer conditons and assignments, I'll also give you an alternative control structure:
my @f;
{
redo if $_ = shift @f || <STDIN>;
}
If you're only reading from STDIN at the beggining, or don't mind copying and pasting a bit, then both solutions are strong. They mean one less module to debug, and one less layer of complexity in your code. It also gives a speed bonus over tie()-ing. If you _must_ tie to *STDIN,
gmpassos provides
an elegant solution. I feel like that's an unnecessary convolution, though.