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

Dear Monks,
I am new to Perl.
I having a File that some code and C structures defined.
I am trying to read the structure and get it's element values.
I wrote a regular expression, but it would not work across a line.
This is a brief overview of what I did.
$Fil = "test.txt" open Fil or die "cannot open file" while(<Fil>) { if($_=~m/name_of_the_struct/ .. $_=~m/};/) { if($_=~m/[ ]*{[ -,"\nA-Za-z0-9]*}/ { do_some_oper; } } } Example struct struct name_of_the_struct[]= { { 1, "abc", 234 , <new line> 567,90 }, {2,"asd",333,455,677} };
I tried even stripping new lines just before checking for
the pattern, It does not work. Can anyone help
me with this. thanks in advance.

Replies are listed 'Best First'.
Re: Regex does not work across new line character
by halley (Prior) on Mar 19, 2004 at 17:39 UTC
    This isn't a problem with regular expressions. Your code only gets one line of the file at a time when you code your loop like that.
    while (<Fil>) { # $_ has the current line from Fil ... }
    If you need to search across newline boundaries, then you should either (1) define a different boundary for each chunk to be read with $/, or (2) read the whole thing in as one big string (i.e., using no $/ at all). There are other more complicated methods, but unless we know what you're really trying to accomplish, I wouldn't go into them now.

    Then when you use regular expressions, you may want to use the /s modifier as appropriate.

    Details in perlvar (for $/) and perlre (for /s).

    --
    [ e d @ h a l l e y . c c ]

Re: Regex does not work across new line character
by tinita (Parson) on Mar 19, 2004 at 17:43 UTC
    uhm, you're reading line by line, so it's impossible for the regex to match over two lines.
    (secondly, the dot . does not match a newline (but everything else). just fyi, you don't have a dot in your regex.)
    you'd probably have to concatenate the string in between the // .. // and then after it match it with the regex.
Re: Regex does not work across new line character
by TomDLux (Vicar) on Mar 20, 2004 at 15:23 UTC

    It must be an interesting struct if it can hold both strings and integers.

    It's not at clear just what precisely you are tryiong to achieve, so it's not possible to suggest ways to do it. However, if line-by-line procecssing presents problems, it might be worth looking at processing the whole struct initialization at once. Either accumulate the lines, one by one, in a variable, until you are sure you have it all, or else change the end-of-line character temporarily to '}'or ';' ( local $/ = '}'; ) to slurp up larger chunks. Of course, you'll have to be careful not to be fooled by an internal separator.

    Most of the time I'm encouraging people to stop slurping, and process line-by-line, but every oncee in a while slurping does help.

    --
    TTTATCGGTCGTTATATAGATGTTTGCA

      Thanks for your reply. Let me try and explain what I am about to do.
      I have to read a specific structure in a *.h C File, I am
      searching it by name, and get it's contents to form a HTML page on the fly.
      Example
      struct mystruct[]={ {"a",1}, {"b",2}};
      I want to form a HTML page with the values a,b,1,2 and so on .
      Supposing that I have a big string, how do I get multiple matches at a time.
      Let's say that in a sentence 'the' occurs four times and I want all the 4 matches the same time.
      My questions may be bad as this is my first Perl program kindly bear with me.
      Thanks in Advance.
      I have tried and accumulated the whole sturcture in a string.