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

Dear All,
My test is as follows:

$line = "jlla jldsfjlfj lfla (1\p=n-\5) fk (2) ljljj ljlfaufi lfjlakf +h (10, 11) lfjdlaj (10, 11\p=n-\15) ndsfdjksnk (2, 15, 16) dkhfak";

my output of the $line should be like this.

$line = "jlla jldsfjlfj lfla (<lr=C1>1</lr>\p=n-\<lr=C5>5</lr>) fk (<l +r=C2>2</lr>) ljljj ljlfaufi lfjlakfh (<lr=C10>10</lr>, <lr=C11>11</l +r>) lfjdlaj (<lr=C10>10</lr>, <lr=C11>11</lr>\p=n-\<lr=C15>15</lr>) n +dsfdjksnk (<lr=C2>2</lr>, <lr=C15>15</lr>, <lr=C16>16</lr>) dkhfak";

my code is as follows:

$line=~s!\(([1-9]{1,3}((, |\\p=n-\\)[1-9]{1,3})*)\)!\(@{[map"<lr=C$_>$ +_</lr>",split"(, |\\p=n-\\)",$1]}\)!g;

I am getting the following error:

Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE , |\p=n-\)/ a +t s.pl line 8.

Please help in rectifing the error mentioned.

Thanks and Regards,
Ganesh

20050704 Janitored by Corion: Added formatting

Replies are listed 'Best First'.
Re: small help with map function
by monarch (Priest) on Jul 04, 2005 at 07:28 UTC
    I did the following:

    So, to summarise, a regular expression that exactly matches the example you've provided is:

    $line =~ s!(\d+)!<lr=C$1>$1</lr>!g;
Re: small help with map function
by aukjan (Friar) on Jul 04, 2005 at 07:30 UTC
    When you see error's like that, you are missing a '(' in your code. It might help to rewrite the regular expression with the 'x' option, so you can have whitespaces (including newlines) in your code. This makes it easier to see if/what you are missing:
Re: small help with map function
by Hena (Friar) on Jul 04, 2005 at 07:34 UTC
    First use '' in an example, where you don't want to be bitten by translation eg. $line in this.

    Second. Why use such in obscure map line when this will do the job nicely.
    $line=~s#(\d+)#<lr=C$1>$1</lr>#g;
Re: small help with map function
by gaal (Parson) on Jul 04, 2005 at 07:29 UTC
    Your problem isn't in the map, it's in the split. Consider using the /e modifier to the substitution; that'll let you avoid the nasty interpolation. Also, keep in mind that split "foo" means split /foo/.
Re: small help with map function
by ysth (Canon) on Jul 04, 2005 at 22:27 UTC
    Using split "regex" does backslash interpretation first. Then when the regex is compiled, it sees m/(, |\p=n-\)/ with the right parenthesis escaped. Use split /regex/ instead.

    You should avoid using a quoted string as the first parameter to split, except for the special split " " form. It leads to people forgetting that it's actually a regex and doing split "|", etc. (though that's not quite what you've run into).