sub show { my @data = @_; for (@data) { s/(\266|\267)/sprintf"%%%02X",ord $1/egm; s/ /chr(0267)/egm; s/\t/ -> /gm; s/\n/chr(0266)."\n"/egm; } return wantarray ? @data : join'',@data; } sub hide { my @data = @_; for (@data) { s/ -> /\t/gm; s/\266//gm; s/\267/ /gm; s/%([0-9a-f][0-9a-f])/chr hex $1/eigm; } return wantarray ? @data : join'',@data; } @data = ()[0..7]; print "Original data, including specials\n\n"; print @data; print "\n\nShow invisible chars in data\n\n"; print show(@data); print "\n\nHide and show data - should not change\n\n"; print hide(show(@data)); __DATA__ tab 4 spaces, trailing tab tab and 4 spaces ····4·spaces,·trailing·tab -> ¶ -> ····tab·and·4·spaces¶ -> -> ¶ ¶