http://www.perlmonks.org?node_id=535139


in reply to Re: Matching string, then getting next line
in thread Matching string, then getting next line

Hi THe problem with that is, that when perl reads my file which was created on windows, it treats the whole file as one line, that is why i had to use FILE::Slurp to split out the lines. So what i need to do is say okay if you match my line, place the value into a variable and then get the next line whatever it is and place that into a variable.
  • Comment on Re^2: Matching string, then getting next line

Replies are listed 'Best First'.
Re^3: Matching string, then getting next line
by inman (Curate) on Mar 08, 2006 at 11:35 UTC
    I guess that you are trying this with a file that has been generated on Windows and then transferred to a UNIX box. You end up with extra ^M chars when you look at the file using vi. Try trimming the surplus whitespace using a regex
    #!/usr/bin/perl -w use strict; while (<MYFILE>){ s/\s+$//; if (/NEXT LINE MARKER/) { my $nextLine = <MYFILE>; $nextLine =~ s/\s+$//; print "$nextLine\n"; # do stuff with the next line here. } }
      That does work, but it splits out the lines that i am looking for so when i run it i end up with.
      #!/usr/bin/perl open(MYFILE, "log.log"); while (<MYFILE>){ s/\s+$//; if (/Message\sdump:/) { my $nextLine = <MYFILE>; $nextLine =~ s/\s+$//; print "Found=$nextLine\n"; # do stuff with the next line here. } }

      Found=23 06/02/23 11:19:34:750 Received FIX message Found=8=FIX.4.29=024935=D34=743=N49=COMPLEX_EXLINK50=DBL9991456=EXLINK +_COMPLEX57=COMPLEXGATE97=N52=20060223-11:18:4660=20060223-11:18:46207 +=XEUR55=XEURFDAX0F2006H200=20060340=259=044=58681=L60954=111=Order58: +1:1140693526109=DBL9991421=238=1167=FUT10=096
      When the format is
      Message dump: 8=TEST.4.29=038435=849=TEST56=TEST50=COMPLEXGATE57=DBL9991134=852=2006 +0223-11:19:351=L6096=0.000011=Order58:1:114069352614=0.000017=11193 54210120=031=0.0000000032=0.000037=132710015138=1.000039=854=155=XEURF +DAX0F2006H58=EUREX Error PRICE60=20060223-11:19:34150=8151=1.0000109= +D BL9991463=0167=TEST=200603207=TEST=244=5868.0000000010=101 25 06/02/23 11:20:00:765 Received TEST message Message dump: 8=TEST.4.29=025135=D34=843=N49=TEST50=TEST=TEST57=COMPLEXGATE97=N52=20 +060223-11:19:1060=20060223-11:19:10207=XEUR55=XEURFDAX0F2006H 200=20060340=259=044=5867.51=L60954=111=Order63:1:1140693551109=DBL999 +1421=238=1167=FUT10=166 26 06/02/23 11:20:01:500 Sent TEST Message Message dump:
        Actually you'd better remove only the ending "CR" characters, not spaces :
        while (<MYFILE>) { s/\r\n$/\n/g; ... }
        This simply replace "<CR><LF>" (DOS end of lines) with "<LF>" (Unix end of line)
Re^3: Matching string, then getting next line
by cas2006 (Novice) on Mar 08, 2006 at 23:47 UTC
    > THe problem with that is, that when perl reads my file
    > which was created on windows, it treats the whole file as one line

    that's odd. most MSDOS/Windows files use CR/LF as the end-of-line marker, but it sounds like your file uses just CR...are you sure it's a DOS file and not a Mac file?

    to read MSDOS/Windows text files, you need to set the input record separator to CR/LF rather than newline (actually, this isn't strictly necessary. if you don't do it, you just end up with a CR at the end of each line. chomp will get rid of it)

    i.e.

    $/="\r\n";

    to read Mac text files, set it to just CR:

    $/="\r";

    see the man page for 'perlvar' for more info.