in reply to Re: split on the pattern of '),('
in thread split on the pattern of '),('

my $string = "(foo),(bar),(baz)"; my @parts = split m{ [)] [,] [(] }x, $string; print "GOT: $_\n" for @parts;

Instead of m{ [)] [,] [(] }x you could use m{ \) , \( }x ... whichever you think is most readable. Either way, try to avoid the appearance of a million toothpicks standing on end.

perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Replies are listed 'Best First'.
Re^3: split on the pattern of '),('
by ikegami (Patriarch) on Sep 17, 2012 at 18:17 UTC
    That fails for
    $str = '(1,"(text),(text)", 123),(2,"(string)", 234),(...)';

      No it doesn't. The string you give contains "),(" three times, and my regex splits it at all three.

      use Test::More tests => 5; my $string = '(1,"(text),(text)", 123),(2,"(string)", 234),(...)'; my @parts = split m{ [)] [,] [(] }x, $string; # Prove that the split worked properly... # Firstly, joining the parts back with '),(' recreates the original st +ring. my $joined = join '),(', @parts; is($joined, $string); # Secondly, none of the individual parts contain '),(' unlike($_, qr{\Q),(\E}) for @parts; done_testing();
      perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

        For the input I gave, the code you gave produced:

        GOT: (1,"(text GOT: text)", 123 GOT: 2,"(string)", 234 GOT: ...)

        But surely, it should produce:

        GOT: 1,"(text),(text)", 123 GOT: 2,"(string)", 234 GOT: ...