For Programmers: Free Programming Magazines  


Home > Archive > PERL Miscellaneous > December 2004 > problems with Perl RegEx match









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author problems with Perl RegEx match
mitch

2004-12-27, 8:56 pm

Hi folks,

I am working on a what I thought would be fairly simple regular
expression search. I am simply trying to take a full URL (something
like http://www.someurl.com/someDir/file.html) and parse it out into
its components domain and path (domain = www.someurl.com & path =
/someDir/file.html). So I wrote this little script to do just that.
However, I am getting an error when I run my script and I think it has
something to do with my regex function that I am using. So here is the
code snippet of the offending line:

if ($externalLink =~ m/http:\/\/([^\/]+)/) {
$domain = $1;
$path = $';
}

The error that I am getting is this:
Missing right bracket at ./LogPreProcessor_Inetprod.pl line 64, at end
of line
syntax error at ./LogPreProcessor_Inetprod.pl line 64, at EOF
Execution of ./LogPreProcessor_Inetprod.pl aborted due to compilation
errors.

I also tried to modify the script by removing the \ from within the
square brackets:

if ($externalLink =~ m/http:\/\/([^/]+)/) {
$domain = $1;
$path = $';
}

But that too gives me an error:
bash-2.03$ LogPreProcessor_Inetprod.pl inet.log
/http://([^/: unmatched [] in regexp at ./LogPreProcessor_Inetprod.pl
line 26.
bash-2.03$

So I tried a bunch of other variations, wich also did not work. After
consulting several books and googling for some solution, I thought that
I had exhausted all my research possibilities and I thought that the
smart folks in this group could show me the error of my ways.

On a side note, when I used the following search term in google to look
for a solution:

Perl "[^/]"

Google seemed to ignore all those special characters, and simply
returned any page that contained the term 'Perl'. So that was useless.
Thanks for all your help in this matter.

Regards,

Mitch

Gunnar Hjalmarsson

2004-12-28, 3:56 am

mitch wrote:
> I am working on a what I thought would be fairly simple regular
> expression search. I am simply trying to take a full URL (something
> like http://www.someurl.com/someDir/file.html) and parse it out into
> its components domain and path (domain = www.someurl.com & path =
> /someDir/file.html). So I wrote this little script to do just that.
> However, I am getting an error when I run my script and I think it
> has something to do with my regex function that I am using. So here
> is the code snippet of the offending line:
>
> if ($externalLink =~ m/http:\/\/([^\/]+)/) {
> $domain = $1;
> $path = $';
> }


That code works fine for me.

> The error that I am getting is this:
> Missing right bracket at ./LogPreProcessor_Inetprod.pl line 64, at
> end of line syntax error at ./LogPreProcessor_Inetprod.pl line 64, at
> EOF Execution of ./LogPreProcessor_Inetprod.pl aborted due to
> compilation errors.


So, what's at (and right before and after) line 64 in your script?

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl
Abigail

2004-12-28, 3:56 am

mitch (mitch_christow@biogen.com) wrote on MMMMCXXXVII September MCMXCIII
in <URL:news:1104192460.971234.138440@f14g2000cwb.googlegroups.com>:
!! Hi folks,
!!
!! I am working on a what I thought would be fairly simple regular
!! expression search. I am simply trying to take a full URL (something
!! like http://www.someurl.com/someDir/file.html) and parse it out into
!! its components domain and path (domain = www.someurl.com & path =
!! /someDir/file.html). So I wrote this little script to do just that.
!! However, I am getting an error when I run my script and I think it has
!! something to do with my regex function that I am using. So here is the
!! code snippet of the offending line:
!!
!! if ($externalLink =~ m/http:\/\/([^\/]+)/) {
!! $domain = $1;
!! $path = $';
!! }

It really, really helps to make your code fragments more readable.
If your regex itself has slashes, use different delimiters, so your
regex isn't sprinkled with slashes. And INDENT:

if ($externalLink =~ m!http://([^/]+)!) {
$domain = $1;
$path = $';
}

!! The error that I am getting is this:
!! Missing right bracket at ./LogPreProcessor_Inetprod.pl line 64, at end
!! of line
!! syntax error at ./LogPreProcessor_Inetprod.pl line 64, at EOF
!! Execution of ./LogPreProcessor_Inetprod.pl aborted due to compilation
!! errors.

That error doesn't sound it has anything at all to do with the regexp
given. The error strongly suggests you have left of a right (closing)
bracket somewhere in your code, and upon reaching the end of the file,
Perl didn't encounter it.

Count your opening and closing brackets.

!! I also tried to modify the script by removing the \ from within the
!! square brackets:
!!
!! if ($externalLink =~ m/http:\/\/([^/]+)/) {
!! $domain = $1;
!! $path = $';
!! }
!!
!! But that too gives me an error:
!! bash-2.03$ LogPreProcessor_Inetprod.pl inet.log
!! /http://([^/: unmatched [] in regexp at ./LogPreProcessor_Inetprod.pl
!! line 26.
!! bash-2.03$
!!
!! So I tried a bunch of other variations, wich also did not work. After
!! consulting several books and googling for some solution, I thought that
!! I had exhausted all my research possibilities and I thought that the
!! smart folks in this group could show me the error of my ways.

Error messages can also be found in the 'perldiag' manual page.

!! On a side note, when I used the following search term in google to look
!! for a solution:
!!
!! Perl "[^/]"
!!
!! Google seemed to ignore all those special characters, and simply
!! returned any page that contained the term 'Perl'. So that was useless.

Yes. But why on earth would you look for 'Perl "[^/]"'? You get an error
message. Why didn't you a search for that error message? I googled for

"Missing right bracket" Perl

and the fourth hit told me exactly what happened. Which isn't too bad,
considering it's an error message from an older Perl - in newer Perls,
the error message is rephrased.
--
perl -e '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %;
BEGIN {% % = ($ _ = " " => print "Just Another Perl Hacker\n")}'
Lars Eighner

2004-12-28, 3:56 am

In our last episode,
<1104192460.971234.138440@f14g2000cwb.googlegroups.com>, the
lovely and talented mitch broadcast on comp.lang.perl.misc:

> Hi folks,


> I am working on a what I thought would be fairly simple regular
> expression search. I am simply trying to take a full URL (something
> like http://www.someurl.com/someDir/file.html) and parse it out into
> its components domain and path (domain = www.someurl.com & path =
> /someDir/file.html). So I wrote this little script to do just that.
> However, I am getting an error when I run my script and I think it has
> something to do with my regex function that I am using. So here is the
> code snippet of the offending line:


> if ($externalLink =~ m/http:\/\/([^\/]+)/) {
> $domain = $1;
> $path = $';
> }


I'm not following all of this but, why make things hard on
yourself. Use any other quote character besides /, and you
won't have to escape them. Also as you would see, if you even
took a glance at perlretoot, / is NOT special in [].

m#http://([^/]+)#

isn't that about 100 times easier to read and work with?

(However, even as it stands, your snippet works fine for
me.)

> The error that I am getting is this:
> Missing right bracket at ./LogPreProcessor_Inetprod.pl line 64, at end
> of line
> syntax error at ./LogPreProcessor_Inetprod.pl line 64, at EOF
> Execution of ./LogPreProcessor_Inetprod.pl aborted due to compilation
> errors.


Useless without all of the code. Pretty likely the problem is
above the snippet.

You know there is a module to parse URLs. So, howcome reinvent
the wheel?

> I also tried to modify the script by removing the \ from within the
> square brackets:


> if ($externalLink =~ m/http:\/\/([^/]+)/) {
> $domain = $1;
> $path = $';
> }


> But that too gives me an error:
> bash-2.03$ LogPreProcessor_Inetprod.pl inet.log
> /http://([^/: unmatched [] in regexp at ./LogPreProcessor_Inetprod.pl
> line 26.
> bash-2.03$


Yeah, that really doesn't work, even without garbage above it,
but nothing will work because you did not include in the
original snip the part with the real problem.

> So I tried a bunch of other variations, wich also did not work. After
> consulting several books and googling for some solution, I thought that
> I had exhausted all my research possibilities and I thought that the
> smart folks in this group could show me the error of my ways.


> On a side note, when I used the following search term in google to look
> for a solution:


> Perl "[^/]"


> Google seemed to ignore all those special characters, and simply
> returned any page that contained the term 'Perl'. So that was useless.
> Thanks for all your help in this matter.


> Regards,


> Mitch


--
Lars Eighner eighner@io.com http://www.io.com/~eighner/
Behaviorism is the art of pulling habits out of rats. -- O'Neill
mitch

2004-12-28, 3:57 pm

Hi everyone,

Thanks first of all for all the great comments and suggestions. So
Abigail, you were right, I foolishly forgot to close a silly brace.
That should teach me to write code after only sleeping for two hours
(boy do I feel sheepish).

In terms of indenting, my code is beautifully indented, however while
posting it, the tabs and spaces had been removed. Next time I'll add
some HTML code to the posting, just so that it gets formatted properly.


In any event, I appreciate all the comments and thanks again for the
prompt response. It took me literaly 10 seconds to find the missing
brace. I guess sometimes you have been staring too long at the code to
see the problem. I was convinced that the problem was in the RegEx.
Well, live and learn.... thanks again folks.

Regards,

Mitch

Abigail

2004-12-28, 8:57 pm

mitch (mitch_christow@biogen.com) wrote on MMMMCXXXVII September MCMXCIII
in <URL:news:1104248521.746602.313050@f14g2000cwb.googlegroups.com>:
%%
%% In terms of indenting, my code is beautifully indented, however while
%% posting it, the tabs and spaces had been removed. Next time I'll add
%% some HTML code to the posting, just so that it gets formatted properly.

Adding HTML code is a sure way of getting killfiled by those who are
most likely to answer your queries.

If whitespace gets removed, get a better newsagent.


Abigail
--
perl -Mstrict='}); print "Just another Perl Hacker"; ({' -le1
Peter Wyzl

2004-12-28, 8:57 pm

"mitch" <mitch_christow@biogen.com> wrote in message
news:1104248521.746602.313050@f14g2000cwb.googlegroups.com...
: Hi everyone,
:
: Thanks first of all for all the great comments and suggestions. So
: Abigail, you were right, I foolishly forgot to close a silly brace.
: That should teach me to write code after only sleeping for two hours
: (boy do I feel sheepish).
:
: In terms of indenting, my code is beautifully indented, however while
: posting it, the tabs and spaces had been removed. Next time I'll add
: some HTML code to the posting, just so that it gets formatted properly.

Don't do that. Just replace the tabs with an appropriate number of spaces
(3 or 4 should be fine)

--
Wyzelli


Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com