tie $foo, Stack, 'fifo' or die "Could not tie"; $foo = $_ for (1..10); print while (defined($_ = $foo)); package Stack; sub TIESCALAR { $_[1] =~ /[fl]i[fl]o/i && return bless [$_[1],[]], $_[0]; } sub STORE { push @{$_[0]->[1]}, $_[1]; } sub FETCH { return undef unless @{$_[0]->[1]}; if ($_[0]->[0] =~ /(f|l)i\1o/i) { return shift @{$_[0]->[1]}; } else { return pop @{$_[0]->[1]}; } }