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

Hi,
I have a problem with perl matches. I am trying to read a xml file where I have to start reading when I see a patternThe pattern keeps changing every time in a for loop) and stop reading when I see another pattern( the sto p pattern remains the same)
Now the code I am trying is this.

while (<FILE>) { my $reading = 0; $reading++ if $reading; if(/.* ss:Name=\"$file*/oi){ # When we see <Appxxx> start storing the data print "VALUE IS $value \n"; $reading = 1; } $reading = 0 if (/<Row AutoFitHeight=\"0\">/); next unless $reading; print "$_"; }

here is the part of the file I am reading:

<Worksheet ss:Name="Appxxx"> <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="4" x:FullColumn +s="1"> <Row ss:StyleID="s21"> <Cell><Data ss:Type="String">APPLES</Data></Cell> <Cell><Data ss:Type="String">GRAPES</Data></Cell> <Cell><Data ss:Type="String">TOWELS</Data></Cell> <Cell><Data ss:Type="String">NUMBER1</Data></Cell> <Cell><Data ss:Type="String">NUMBER2</Data></Cell> <Cell><Data ss:Type="String">NUMBER3</Data></Cell> <Cell><Data ss:Type="String">NUMBER4</Data></Cell> </Row> <Row> <Cell><Data ss:Type="Number">9</Data></Cell> <Cell><Data ss:Type="Number">0</Data></Cell> <Cell><Data ss:Type="Number">0</Data></Cell> <Cell><Data ss:Type="Number">0</Data></Cell> <Cell><Data ss:Type="Number">4</Data></Cell> <Cell><Data ss:Type="Number">126</Data></Cell> <Cell><Data ss:Type="Number">5</Data></Cell> <Cell><Data ss:Type="Number">144</Data></Cell> <Cell><Data ss:Type="String">01/24/2006-03:00</Data></Cell> </Row> <Row AutoFitHeight="0">

20060126 Janitored by Corion: Added formatting

Replies are listed 'Best First'.
Re: match and read
by GrandFather (Saint) on Jan 26, 2006 at 08:46 UTC

    There are a number of problems with you code fragment. In particular $value never gets a value and $reading can never become non-zero. Perhaps you could sort those problems first, then you could tell us what the problem is that you see and what result you would rather see.

    Note that using a __DATA__ section as in the sample code below means that we can all share the pleasure of testing your code for you. Note too that use warnings; use strict; often saves red faces.


    DWIM is Perl's answer to Gödel
Re: match and read
by chargrill (Parson) on Jan 26, 2006 at 08:47 UTC
    I know that for sake of brevity, you're likely omitting large portions of code. But I'm having trouble seeing where $file and $value come from, what you do with your matches, etc. Further, the poor formatting/indentation (that it appears an attempt was made by the janitorial staff to clean up a bit) doesn't help matters, either .


    $/ = q#(\w)# ; sub sig { print scalar reverse join ' ', @_ } + sig map { s$\$/\$/$\$2\$1$g && $_ } split( ' ', ",erckha rlPe erthnoa stJu +" );
Re: match and read
by tweetiepooh (Hermit) on Jan 26, 2006 at 11:38 UTC
    Setting $reading to zero inside the loop doesn't seem right at all. Try...
    #!perl use warnings; use strict; my $r = 0 while (<DATA>) { $r++ if $r; if (/start/) { $r = 1; print "Start storing...\n"; } $r = 0 if (/end/); next unless $r; print; } __DATA__ predata more predata start real data more real data end post data post data
Re: match and read
by Tanktalus (Canon) on Jan 26, 2006 at 16:10 UTC

    I'm trying to figure out why you aren't treating the file as XML, and thus using an XML module, such as XML::Twig to parse and deal with it. For example, in this case, you could load it up in XML::Twig, and then cut out twigs that you don't care about. Or the reverse - use xpath to find twigs that you do care about. Or a combination.

    It also allows you to reformat the output using a pretty-print mode, or to compress out unneeded whitespace or ... well, there's lots of room for doing wonderful things once you treat the data in the format it is rather than as just another text file.

      Hi Again, I fixed the problem. There was a small syntax issue in the begining parts of the code. Thank u kindly