Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Strings mangled on printing

by gordu (Initiate)
on Jun 03, 2015 at 17:37 UTC ( [id://1128974]=perlquestion: print w/replies, xml ) Need Help??

gordu has asked for the wisdom of the Perl Monks concerning the following question:

Over the years I've dabbled in perl and every once in a while I get bit by this problem. Basically strings I try and print come out mangled. As an example

#!/usr/bin/perl use strict; use Device::SerialPort; use FileHandle; my $fh = FileHandle->new; my $port = Device::SerialPort->new("/dev/ttyACM1"); $port->databits(8); $port->baudrate(57600); # <-- match to arduino settings $port->parity("none"); $port->stopbits(1); $port->dtr_active(0); my $i=1000; my $rt = 0; my $rh = 0; my $it = 0; my $foos=""; select(STDOUT); while($i> 0) { my $inp = $port->lookfor; if($inp ne "") { if($inp =~ /Remote Temp:/) { $rt = $inp; $rt =~ s/Remote Temp://; print "inp=$inp\n"; print "rt=$rt\n"; $foos="$rt does not print rt \n"; print $foos; print "rt=$rt\n\n"; } } } $port->close; undef $port;
The output from running this is
inp=Remote Temp:22.30 rt=22.30 does not print rt rt=22.30

Whats happening? BTW the input is a string like "Remote Temp:22.30"

Replies are listed 'Best First'.
Re: Strings mangled on printing
by Paladin (Vicar) on Jun 03, 2015 at 17:40 UTC
    Check to see if $rt has a carriage return character at the end of it. Perhaps add something like $rt =~ s/\r//g; to strip any out.

      $rt = $inp; chomp $rt; # insert at line 23 $rt =~ s/Remote Temp://;

      chomp() would probably be more appropriate, since it removes (from the docs) "any trailing string that corresponds to the current value of $/ (also known as $INPUT_RECORD_SEPARATOR in the 'English' module)", and $/ can be set to the appropriate value if there is a difference in line endings/separators (such as "\n" vs. "\r" vs "\r\n" vs. ...).

      Hope that helps.

        atcroft:

        Normally, I'd agree with you, but since the data is coming over a serial port, I wouldn't expect the line endings to be consistent with those used on whatever platform runs the code. So in this case, I'd prefer explicit removal of junk from the end.

        ...roboticus

        When your only tool is a hammer, all problems look like your thumb.

      Arrgh!!!! So simple. I should have asked years ago. Yes that fixed it. Thank you!

        Also note that $inp =~ s/\s+$//; will remove all trailing white space, including newlines (\n) and returns (\r).

        Update: Correct typo (per reply).

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1128974]
Approved by toolic
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (5)
As of 2024-04-16 09:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found