'print' seems to handle $_ differently 'puts':

fh = open './file.txt'
while fh.gets
   print if ~ /\b\w{2}\b/
end

;=> prints matching lines

fh = open './file.txt'
while fh.gets
   puts if ~ /\b\w{2}\b/
end

;=> prints a blank line for every matching line

fh = open './file.txt'
while fh.gets
   puts $_ if ~ /\b\w{2}\b/
end

;=>  prints matching lines

A bit inconsistent?

gvim