Thank you. But i am unable to understand the working of the code which you
have written. Can you please explain it?

Thanks and Regards,
Dharshana

On 6/28/07, Chas Owens <[EMAIL PROTECTED]> wrote:

On 6/27/07, Dharshana Eswaran <[EMAIL PROTECTED]> wrote:
> On 6/28/07, Tom Phoenix <[EMAIL PROTECTED]> wrote:
> >
> > On 6/27/07, Dharshana Eswaran <[EMAIL PROTECTED]> wrote:
> >
> > > I am unable to get a generalised way in which it can extract them as
few
> > > structures have comments, few does not hav comments etc.
> >
> > Does the data have some defined grammar, or a definable one at least?
>
>
>
> The defined Grammer here is
> {
> xyz1 abc1; /*Comments*/
> xyz2 abc2;
> xyz3 abc3[req];
> xyz4 abc4[req]; /*Comments*/
> };
>
> Here, i have defined different possibility of occurences of the
structure
> elements. If i could get a regex for extracting xyz1, xyz2, xyz3, xyz4
and
> abc1, abc2, abc3[req], abc4[req] would be helpful. Here, the comments
are of
> no use, i just need to ignore them.
>
> >If you are up to using Parse::RecDescent, it will probably do the job.
>
> I am restricted from using modules and i am unable to come up with a
regex
> or regexes to do this job.
>
>   >http://search.cpan.org/author/DCONWAY/Parse-RecDescent-1.94
> >/lib/Parse/RecDescent.pod
>
> >Hope this helps!
>
> >--Tom Phoenix
> >Stonehenge Perl Training
>
> Can anyone guide me in this?
>
> Thanks and Regards,
> Dharshana
>

It is fragile, but here are a set of regexes that parse the string you
mentioned.  I did notice that this string differs significantly from
the ones you gave earlier and this set of regexes will not correctly
handle them.

#!/usr/bin/perl

use strict;
use warnings;

my $comment    = qr{\s* (?:/\* .*? \*/ \s*)*}xs;
my $identifier = qr{ [A-Za-z_]\w* }xs;
my $statement  = qr{
        \s*
        ($identifier)
        \s+
        ($identifier)
        \s*
        (?: \[ (.*?) \] )?
        \s*
        ;
        \s*
        $comment?
}xs;

my $str = <<EOS;
{
        xyz1 abc1; /*Comments*/
        xyz2 abc2;
        xyz3 abc3[req];
        xyz4 abc4[req]; /*Comments*/
};
EOS

my @m = $str =~ /$statement/g;

my $iter = by_n(3, [EMAIL PROTECTED]);

while ((my ($type, $var, $elems) = $iter->()) == 3) {
        if ($elems) {
                $type = "array of $type with $elems elements";
        }
        print "type is $type and variable is $var\n";
}

sub by_n {
        my ($n, $a) = @_;
        my $i = 0;
        sub {
                return undef if $i > $#$a;
                my @ret = @{$a}[$i .. $i + $n - 1];
                $i += $n;
                return @ret;
        }
}

Reply via email to