my $match; my $line; while() { if(m{/\*} .. m{\*/}) { ## single line if(m{(/\*.*?\*/)}) { $match = $1; $line = $.; $hash{$line} = $match; #print "Line $line: Got match '$match'\n"; } else { ## multi-line if( m{(/\*.*)} ) { ## Initial line '/*' $match = $1 . "\n"; $line = $.; # record this line number } elsif( m{(.*\*/)} ) { ## Final line '*/' $match .= $1; $line = $.; $hash{$line} = $match; #print "Line $line: Got match '$match'\n"; $match = undef; $line = undef; } else { # We are between lines, and have no /* or */ $match .= $_; } } } elsif ( m{(//.*)\Z} ) { $match = $1; $line = $.; $hash{$line} = $match; #print "Line $line: Got match '$match'\n"; } }