I’ve got two question about Regexp::Common qw/URI/ and Regex in Perl.
I use Regexp::Common qw/URI/ to parse URI in the strings and delete them. But I’ve got an error when a URI is between parentheses.
For example: (http://www.example.com)
The error is caused by ‘)’, and when it try to parse the URI, the app crash. So I’ve thought two fixes:
- Do a simple (or I thought so) that writes a whitespace between parentheses and
)characters - The
Regexp::Common qw/URI/has a function that implement a fix.
In my code I’ve tried to implement the Regex but the app freezes. The code that I’ve tried is this:
use strict;
use Regexp::Common qw/URI/;
my $str = "Hello!!, I love (http://www.example.com)";
while ($str =~ m/\)/){
$str =~ s/\)/ \)/;
}
my ($uri) = $str =~ /$RE{URI}{-keep}/;
print "$uri\n";
print $str;
The output that I want is: (http://www.example.com )
I’m not sure, but I think that the problem is in $str =~ s/\)/ \)/;
BTW, I’ve got a question about Regexp::Common qw/URI/. I’ve got two string type:
- ablalbalblalblalbal
http://www.example.com - asfasdfasdf
http://www.example.comaasdfasdfasdf
I want to remove the URI if it is the last component (and save it). And, if not, save it without removing it from the text.
Your program goes into an infinite loop at this point. To see why, try printing the value of $str each time round the loop.
The first time it prints “Hello!!, I love (GOOGLE )”. The while loop condition is then evaluated again. Your string still matches your regular expression (it still contains a closing parenthesis) so the replacement is run again and this time it prints out “Hello!!, I love (GOOGLE )” with two spaces.
And so it goes on. Each time round the loop another space is added, but each time you still have a closing parenthesis, so another substitution is run.
The simplest solution I can see is to only match the closing parenthesis if it is preceded by a non-whitespace character (using \S).
In this case the loop is only executed once.