Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Remove new line characters from PCL file

by coco (Initiate)
on Jan 16, 2009 at 16:55 UTC ( #736874=perlquestion: print w/replies, xml ) Need Help??
coco has asked for the wisdom of the Perl Monks concerning the following question:

I have the following line of text in my script

 $var = do {local $/; <$FILE>};#<-- slurp whole file in scalar

The problem i am having is that the input file is a pcl file and has new line characters in the middle of a line. When the perl script is evaluating each line it meets this new line character and outputs it onto a new line which affects the final print.

Can anyone tell me how to assign the text to the $var variable without evaluating the new line character?

maybe using the ':raw' command would that work? or can someone describe how to use it?


Replies are listed 'Best First'.
Re: Remove new line characters from PCL file
by JavaFan (Canon) on Jan 16, 2009 at 16:58 UTC
    No, if you're going to slurp in the entire file, and you don't want certain characters in the resulting string, you have to remove them yourself.

    Fortunally, removing characters from a string using Perl is rather trivial. I'm sure you've heard of the tr/// and s/// operators.

      Hi thanks for response.

      The thing is that when i open the '.dat' file and assigning it to the variable the new line character has already been evaluated and applied to the format so what i am looking for is that the script takes the line literally and not apply the new line character.

      I would then be carrying out a tr// on the already changed file which would not give me the desired results, which is basically to have a mirror image of the imput file with a couple of word changes.

        I'm guessing here... I'm guessing that this is a Win32 issue, and the '.dat' file is binary, not text... which case the problem could be: by default Perl, when reading by <$FILE> will replace CRLF pairs by LF -- irrespective of the state of $/.   print will do the inverse on output.

        To avoid this you can: open $FILE, '<:raw', ... ; or open $FILE, '<', ... ; binmode($FILE) ; , for input and similarly for output. (See binmode and open.) Or you can use read (read), or for deeper magic, sysread (sysread).

        Aside from being the default value for $/ (the end of line marker when reading), line feeds aren't special to Perl. Perl doesn't apply any formatting (contrary to what you claim).

        maybe using the ':raw' command would that work?

        That would prevent CR+LF from being transformed to LF when reading in Windows. You can use it as follows:

        what i am looking for is that the script takes the line literally and not apply the new line character

        Perhaps it's just me, but I don't understand what you mean there - you want Perl to 'take the line literally'? (rather than taking it figuratively or metaphorically?)

        Could you re-phrase this, it's not clear (to me at least) why just taking out the newline characters with tr/// won't give you the result you want.

        update: re-reading the original question, it looks like its the concept of 'new line characters in the middle of a line' which is proving slippery. Not to sound pedantic, but I've never seen a newline character in the middle of a line. They tend to be at the end of each line.

        Do you mean that some of the newlines are ones you want to keep, and some of them are unwanted?

        How do you tell apart the ones you want versus the ones you don't want? Maybe if you were to show us a sample of the file, we'd be able to help you better.

        Or is this a UNIX-versus-DOS different-newline-characters issue?

        update2: or do you mean that some of the newline characters are (or should be) escaped?

Re: Remove new line characters from PCL file
by CountZero (Bishop) on Jan 16, 2009 at 17:18 UTC
    What's wrong wih reading the file line-by-line and chomping each line before concatenating them to $var?
    while (<$FILE>) { chomp; $var .= $_; }
    Or if you really want to slurp the whole file at once:
    $var = join '', map {chomp; $_} <$FILE>;
    Depending on the structure of the file, you may want to concatenate or join with a space to avoid running the lines into each other.

    Update: added the slurp solution.


    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://736874]
Approved by toolic
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (13)
As of 2017-02-27 23:10 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (393 votes). Check out past polls.