Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re: parsing a multi-line pattern and replacing

by rjt (Curate)
on Apr 24, 2014 at 19:35 UTC ( #1083675=note: print w/replies, xml ) Need Help??

in reply to parsing a multi-line pattern and replacing

Why are you using Tie::File? Doing line-based matching will be tricky. Unless your files are huge (many megabytes), slurping the entire file will be both faster and easier, and File::Slurp save you from worrying about any temp file mechanics:

use File::Slurp 'edit_file'; edit_file { s!<default>.+?</default>!<default>enabled</default>!sg } ' +inputfile';

With the same inputfile you list, I get the expected output:

this is line 1 this is line 2 <default>enabled</default> this is line 3 <default>enabled</default> this is last line

Have a look at File::Slurp for more information on this often overlooked but very handy function.

use strict; use warnings; omitted for brevity.

Replies are listed 'Best First'.
Re^2: parsing a multi-line pattern and replacing
by ghosh123 (Monk) on Apr 25, 2014 at 04:55 UTC

    Many thanks for your suggestion.
    You all are correct, for ease of explanation I did not mention that the inputfile is a XML file.
    Basically I have a hash which contains the tags of xml and their default values .
    Now only those tags will be replaced which has a key in the hash. So the xml inputfile actually looks like :


    And lets assume the hash has 2 keys for id and workarea :

    %hash = (id => 94848, workarea=> '/home/unix' )
    So in this case while parsing the xml , I will only replace <default> values for <id> and <workarea>

      I could do it myself. Here goes the code

      tie @array , 'Tie::File' , "$file" ; foreach my $key (keys %varHash) { my $keyflag = 0 ; my $changedVal = $varHash{$key}{newVal}; my $startdef = '<default>'; my $enddef = '</default>'; my $storedindex; print "key $key | changedVal $changedVal \n"; for(my $i = 0 ; $i <= $#array ; $i++) { if($array[$i] =~ /$key/) { print "here $key \n"; $keyflag = 1 ; next; } elsif ($array[$i] =~ /\<default\>.*?\<\/default\>/gs) { # print "array[i] $array[$i] \n"; if($keyflag) { $array[$i] = "$startdef"."$changedVal"."$enddef"; $keyflag = 0; last; } } elsif($array[$i] =~ /^\s*\<default>.*[^\>]$/) { $storedindex = $i ; } elsif($storedindex > 0 ) { if ($array[$i] =~ /\<\/default\>/) { my $range = $i - $storedindex; splice(@array, $storedindex,$range); $array[$storedindex] = "$startdef"."$changedVal"." +$enddef"; last; } } } } untie(@array); }

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1083675]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (1)
As of 2022-07-01 22:12 GMT
Find Nodes?
    Voting Booth?
    My most frequent journeys are powered by:

    Results (102 votes). Check out past polls.