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

I am searching a file for this pattern(Figure <xref ref-type="fig" rid="F1">1</xref>)and need to be replaced as (\protect\customizeref{F1}{Figures}{}) it replaces first match in a line. i used /g operator in regular expression. but no difference.

for($il=0;$il<$isize;$il++) { $input[$il] =~ s/<xref ref-type="fig" rid=/\\protect\\customizeref +{/g; if($input[$il] =~ /\\protect\\customizeref{(.*?)<\/xref>/) { # $input[$il] =~ /<xref ref-type="fig" rid="(.*?)<\/xref>/; print ("$1\n"); $_ = $1; $same = $1; $dx1 = /"(.*)"/; $dx1= $1; $dx2 = />(.*)/; $dx2= $1; print ("$dx1\n"); print ("$dx2\n"); $input[$il] =~ s/\\protect\\customizeref{$same<\/xref>/\\prote +ct\\customizeref{$dx1}{Figures}{}/g; $input[$il] =~ s/$same/$dx1}{Figures}{}/g; } if((defined $same) and (defined $dx1)) { print(">$same\n"); $input[$il] =~ s/$same<\/xref>/$dx1}{Figures}{}/g; } }

Replies are listed 'Best First'.
Re: Multi replace in a Line
by hdb (Monsignor) on Jun 20, 2013 at 09:49 UTC

    My guess would be that the problem is in the line

    $input[$il] =~ s/\\protect\\customizeref{$same<\/xref>/\\protect\\cust +omizeref{$dx1}{Figures}{}/g;

    $same is populated from the first match in the line but you expect it to match every occurence in the line. Unless it is the same every time, it will only fit the first item.

      Thanks for your reply!. In $same i capture the data between my patterns, so once i come out of the loop, i can replace with the pattern i got in $same.

Re: Multi replace in a Line
by gurpreetsingh13 (Scribe) on Jun 20, 2013 at 10:33 UTC
    Could not understand properly. Here is your code, with just print statements commented. I am getting correct output for all enteries, for all lines.
    use strict; use warnings; my @input = ( "Figure <xref ref-type=\"fig\" rid=\"F1\">1</xref> Figure <xref re +f-type=\"fig\" rid=\"F1\">1</xref>", "Figure <xref ref-type=\"fig\" rid=\"F2\">2</xref>", "Figure <xref ref-type=\"fig\" rid=\"F3\">3</xref>" ); my $isize = scalar(@input); my ($same , $dx1 , $dx2); for (my $il = 0; $il < $isize; $il++ ) { $input[$il] =~ s/<xref ref-type="fig" rid=/\\protect\\customizeref +{/g; if ( $input[$il] =~ /\\protect\\customizeref{(.*?)<\/xref>/ ) { # $input[$il] =~ /<xref ref-type=" fig " rid=" ( . *? ) < \/xr +ef>/; #print("$1\n"); $_ = $1; $same = $1; $dx1 = /"(.*)"/; $dx1 = $1; $dx2 = />(.*)/; $dx2 = $1; #print("$dx1\n"); #print("$dx2\n"); $input[$il] =~ s/\\protect\\customizeref{$same<\/xref>/\\protect\\customizere +f{$dx1}{Figures}{}/g; $input[$il] =~ s/$same/$dx1}{Figures}{}/g; } if ( ( defined $same ) and ( defined $dx1 ) ) { #print(">$same\n"); $input[$il] =~ s/$same<\/xref>/$dx1}{Figures}{}/g; } print $input[$il], "\n"; }
    Here is the output. Let me know if it is correct.
    Figure \protect\customizeref{F1}{Figures}{} Figure \protect\customizer +ef{F1}{Figures}{} Figure \protect\customizeref{F2}{Figures}{} Figure \protect\customizeref{F3}{Figures}{}

      thanks for your reply!, I need to find and replace the data in a single line. so our match can be anywhere in the line of the array

        That is what I have done in first line of array. Multiple entries of the same data.