in reply to Re: Global regex giving up too soon
in thread Global regex giving up too soon

1 while $str =~ s/PAT/REPL/;

Is the idiom supposed to contain the /g modifier? You didn't include it and I can't say I've ever seen 1 while s/foo/bar/, only 1 while s/foo/bar/g;. So tell me, should there be a /g there or am I in for a new lesson in the regex classroom?

Replies are listed 'Best First'.
Re: Global regex giving up too soon
by Abigail-II (Bishop) on Jan 20, 2004 at 12:48 UTC
    There doesn't have to be a /g modifier. For some regex/string pairs, it doesn't matter whether there's a /g modifier. For others, it does.

    Abigail

Re: Re^2: Global regex giving up too soon
by Anonymous Monk on Jan 20, 2004 at 13:09 UTC
    my $str = join ' ', map {"$_-PAT"} 1 .. 10; warn $str; 1 while $str =~ s/PAT/REPL/; die $str; __END__ 1-PAT 2-PAT 3-PAT 4-PAT 5-PAT 6-PAT 7-PAT 8-PAT 9-PAT 10-PAT at - line + 2. 1-REPL 2-REPL 3-REPL 4-REPL 5-REPL 6-REPL 7-REPL 8-REPL 9-REPL 10-REPL + at - line 4.
    An infinite loop with 1 while
    my $str = 'A b and A and c and A'; warn $str; $str =~ s/A/a/i for 1,2,3; die $str; __END__ A b and A and c and A at - line 3. a b and A and c and A at - line 5.
      1 while $str =~ s/PAT/REPL/;

      Why not just $str =~ s/PAT/REPL/g;? Gives same result...

      $str =~ s/A/a/i for 1,2,3;

      All this really shows is that without 1 while or the /g modifier that it always matches at the beginning again during reiteration...

      I don't mean to be rude, but you didn't really demonstrate anything too revealing :) I'm looking for a case where there is a difference between 1 while s/foo/bar/ and 1 while s/foo/bar/g.

        #!/usr/bin/perl use strict; use warnings; my $str = "123456"; $_ = $str; 1 while s/(\d)(\d)(\d)/$3$2/; print "$_\n"; $_ = $str; 1 while s/(\d)(\d)(\d)/$3$2/g; print "$_\n"; __END__ 62 52
        Abigail