use Filter::Handle qw/subs/; use strict; { my( $i, $n ) = (0,1); # Scoped, only the filter sees them Filter \*STDOUT, sub { @_ = @_; # Laziness my $string = $n ? "Line ".++$i.": " : ""; for(@_){ s/\n(.)/"\nLine ".++$i.": $1"/egm; $string .= $_ } $n = $_[$#_] =~ /\n$/; return $string; } } # A quick test: print "line 1\n"; print 'line 2', ' line 2 cont.'; print ' more stuff for line 2', "\n"; print "this is line 3\nand this is line 4"; print "\nthis is line 5"; __END__ # And yes, this prints: Line 1: line 1 Line 2: line 2 line 2 cont. more stuff for line 2 Line 3: this is line 3 Line 4: and this is line 4 Line 5: this is line 5