Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re^2: No \G for s///g ? (oops)

by tye (Sage)
on Mar 21, 2003 at 21:52 UTC ( [id://245014]=note: print w/replies, xml ) Need Help??


in reply to Re: No \G for s///g ?
in thread No \G for s///g ?

Thanks! I thought I'd used that before but perlop having several examples of m/\G.../g and no examples of s/\G...//g and no mention of \G in the s/// section combined to make me think maybe that was the problem (as I was posting -- writing up a problem always brings new solutions to mind, ya know).

I verified that this works on my version of Perl as well.

I'd been meaning to post this for a week and finally had a few minutes while waiting for stuff to compile. This response got me to take some time I didn't have to write up some test cases. I must have had an unseen bug in the code when I was testing before because it works fine now.

Thanks, blakem.

                - tye
# my $len= 79; my $len= 9; # my $esc= '\e'; my $esc= '@'; my $eseq= qr[$esc[^a-zA-Z]*[a-zA-Z]]; my $char= qr[(?:$eseq)*[^$esc\n]]; my $nonsp= qr[(?:$eseq)*[^$esc\s]]; local( $/ )= ''; # Paragraph mode while( <DATA> ) { print "Wrapping:\n$_"; { local( $_ )= $_; s[(?:^|(?<=\s))((?:$char){1,$len}(?:$eseq)*)\s][$1\n]g; # print "Loose code1:\n$_"; s[(?:^|(?<=\s))((?:$nonsp){$len}(?:$eseq)*)(?=[^$esc\s])][$1\n +]g; print "Loose code:\n$_"; } s[(?:\G|^)((?:$char){1,$len}(?:$eseq)*)\s][$1\n]gm; # ^^^^ ^ # print "Tight code1:\n$_"; # vv s[(?:\G|(?<=\s))((?:$nonsp){$len}(?:$eseq)*)(?=[^$esc\s])][$1\n]g; print "Tight code:\n$_"; } __END__ @[0;7mCoruscate@[0m says this is a test of the line wrapping code @[0;7mtye@[0m says this is a test @[0;7mtye@[0m says ThisIsATestOfTheEmergencyBroadcastSystemIfThisHadBe +enAnActualEmergency... @[0;7mCoruscate@[0m says this is a test of the line wrapping code @[0;7mCoruscate@[0m says it works! @[0;7mtye@[0m says this is a test @[0;7mtye@[0m says ThisIsATestOfTheEmergencyBroadcastSystemIfThisHadBe +enAnActualEmergency... ThisIsATestOfTheEmergencyBroadcastSystemIfThisHadBeenAnActualEmergency +...
and the output:
Wrapping: @[0;7mCoruscate@[0m says this is a test of the line wrapping code Loose code: @[0;7mCoruscate@[0m says this is a test of the line wrapping code Tight code: @[0;7mCoruscate@[0m says this is a test of the line wrapping code Wrapping: @[0;7mtye@[0m says this is a test Loose code: @[0;7mtye@[0m says this is a test Tight code: @[0;7mtye@[0m says this is a test Wrapping: @[0;7mtye@[0m says ThisIsATestOfTheEmergencyBroadcastSystemIfThisHadBe +enAnActualEmergency... Loose code: @[0;7mtye@[0m says ThisIsATe stOfTheEmergencyBroadcastSystemIfThisHadBeenAnActualEmergency... Tight code: @[0;7mtye@[0m says ThisIsATe stOfTheEm ergencyBr oadcastSy stemIfThi sHadBeenA nActualEm ergency.. . Wrapping: @[0;7mCoruscate@[0m says this is a test of the line wrapping code @[0;7mCoruscate@[0m says it works! @[0;7mtye@[0m says this is a test @[0;7mtye@[0m says ThisIsATestOfTheEmergencyBroadcastSystemIfThisHadBe +enAnActualEmergency... Loose code: @[0;7mCoruscate@[0m says this is a test of the line wrapping code @[0;7mCoruscate@[0m says it works! @[0;7mtye@[0m says this is a test @[0;7mtye@[0m says ThisIsATe stOfTheEmergencyBroadcastSystemIfThisHadBeenAnActualEmergency... Tight code: @[0;7mCoruscate@[0m says this is a test of the line wrapping code @[0;7mCoruscate@[0m says it works! @[0;7mtye@[0m says this is a test @[0;7mtye@[0m says ThisIsATe stOfTheEm ergencyBr oadcastSy stemIfThi sHadBeenA nActualEm ergency.. . Wrapping: ThisIsATestOfTheEmergencyBroadcastSystemIfThisHadBeenAnActualEmergency +... Loose code: ThisIsATe stOfTheEmergencyBroadcastSystemIfThisHadBeenAnActualEmergency... Tight code: ThisIsATe stOfTheEm ergencyBr oadcastSy stemIfThi sHadBeenA nActualEm ergency.. .

Replies are listed 'Best First'.
Re: Re^2: No \G for s///g ? (oops)
by demerphq (Chancellor) on Mar 22, 2003 at 12:52 UTC

    Try setting $len to 5. You'll see that the 'tight' version fails to wrap correctly under certain circumstances like this

    Wrapping: @[0;7mCoruscate@[0m says this is a test of the line wrapping code Tight code1: @[0;7mCoruscate@[0m says this is a test of the line wrapping code Tight code: @[0;7mCorus cate@[0m says this is a test of the line wrapp ing code

    which suggested to me that the regexes be executed in opposite order

    Wrapping: @[0;7mCoruscate@[0m says this is a test of the line wrapping code Tight code1: @[0;7mCorus cate@[0m says this is a test of the line wrapp ing code Tight code: @[0;7mCorus cate@[0m says this is a test of the line wrapp ing code

    which seems to do the trick. I believe the first regex gets stymied by lines that have to be split many times at a space, as well as being split many times inside a word.


    ---
    demerphq


      Good catch. Thanks.

                      - tye

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (3)
As of 2024-04-24 15:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found