perlquestion
NetWallah
I am trying to parse something that looks like a function call, and extract the function name, and the arguments.<p>
Attempting to do this with a single regex gets me either the first, or last arg - I cant seem to handle a variable (can be zero) number of arguments.<p>
Given:
<c>
$cmd=q|&COMPAREEQUAL(First-param.one, Second.param,Third-param)|;
</c>
I am trying to extract:
<ul>
<li>COMPAREEQUAL</li>
<li>First-param.one</li>
<li>Second.param</li>
<li>Third-param</li>
</ul>
<p>
Here is what I have tried:
<c>
perl -e '$cmd=q|&COMPAREEQUAL(First-param.one, Second.param,Third-param)|;
print qq|$_;\n| for
$cmd=~/.(\w+)(?:[\s\(,]+([^\s,!@#\$%&\*]*))*/'
</c>
Including the trailing asterisk gives me the last param. Excluding it gives me the first.<p>
It is getting increasingly obvious that I am not approaching this regex correctly. Please enlighten. Thanks.<p>
The call can have zero arguments. Arguments can contain pretty much anything, other than close-paren , white-space or comma or some nasty side-effect-inducing chars. They are not quoted.<p>
<b>Update 1:</b> This regex gives better results (3 args found), but , for some reason, it does not match the "." in the second.param. Most likely it is because it is using the (\w+) to match the second param. I'm confused about how to repeat only the second part of the regex - the attempt with the non-capturing paren does not seem to repeat that group.
<c>
$cmd=~/.(\w+)(?:[\s(,]+([^\s,!\()]*))/g
</c>
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-159887">
<p> <small>
I hope life isn't a big joke, because I don't get it.
<br>
-SNL
</small></p>
</div></div>