in reply to Pattern search in a Multiline Record, from a multi-record datafile.

use strict; use warnings; my $bad_states = { 'bad' => 1 }; { local $/ = '</ticket>'; my $temp; while (<DATA>) { if (m/<ticket .*?state="(.*?)"/) { next if $bad_states->{$1}; } if (m/<version="(.*?)"/) { $temp = $1; next if $temp =~ /[^\d\.]/; } if (m/<task>(.*?)<\/task>/) { $temp = $1; ### DO SOMETHING WITH TASK VALUE } } } __DATA__ <ticket ... state="bad" ....> <version="1.23.4.8"> .... <task> ... </task> .... </ticket> <ticket ... state="good" ....> <version="bad"> .... <task> ... </task> .... </ticket> <ticket ... state="good" ....> <version="1.23.4.8"> .... <task>value here</task> .... </ticket>
  • Comment on Re: Pattern search in a Multiline Record, from a multi-record datafile.
  • Download Code

Replies are listed 'Best First'.
Re^2: Pattern search in a Multiline Record, from a multi-record datafile.
by Anonymous Monk on Mar 08, 2012 at 21:26 UTC

    Thanks all but my requirments have now slightly changed. (Issue A) Instead of using a file which contains the datadump, I have to read the data from a url. I'm able to read it line by line but not as an array of multi-line records. This is what I have now:

    my $url = "http://......."; my $user_agent = new LWP::UserAgent; my $report = $user_agent->get($url); $report = $report->content; my @code = split("\n", $report);

    Another problem is that as part of the pattern searching within each record from the content of the url, for <task ... />, I need append it as such <task ... a="123"/> and then return this to the parent record and Print that record. So the Input from the url will look something like:"

    <ticket ... state="bad" ....> <version="1.23.4.8"> .... <task ... /> .... </ticket> <ticket ... state="good" ....> <version="bad"> .... <task ... /> .... </ticket> <ticket ... state="good" ....> <version="1.12.32.4"> .... <task ... /> .... </ticket> <ticket ... state="good" ....> <version="1.1.3.9"> .... <task ... /> <task ... /> <task ... /> .... </ticket>

    So in this case, the output should contain only the last 2 records(tickets) as the first 2 records fail the required conditions and the last 2 records which do pass, process the <task ... > lines and are printed accordingly. Also note that there may be more than 1 <task ... > per record. The Output will be dumped into an xml file and should look like:

    <ticket ... state="good" ....> <version="1.12.32.4"> .... <task ... a="1.1.3"/> .... </ticket> <ticket ... state="good" ....> <version="1.1.3.9"> .... <task ... a="1.2"/> <task ... a="5.1"/> <task ... a="8"/> .... </ticket>

    (Issue B): Curently, I'm able to append a=".." to <task ... a=".."> but when I try to print it as part of the updated parent record, its still prining it as it was in the origanl record.

    As you can see, I'm just starting in Perl. Please do help.