Hi Chad.

Chad Kellerman wrote:
> Hello everyone,
>
>      I want to clean this bit of code up.  It looks really messy.  I
> am in a mental block.  Any suggestions?
>
>  @userInfo = split /\s+/, $buffer;

Use a single space here to split on.

    @userInfo = split ' ', $buffer;

It's a special case that splits on contiguous whitespace
like your expression, but discards a null first field if
there are leading spaces in the object string.

>     #insert home users & quota in the db
>     foreach $userInfo ( @userInfo )  {
>
>         ( $name, $quota ) = split /\|/, $userInfo;
>         # get rig of the header info from repquota

I hope you have used 'strict' and 'warnings'? I
haven't seen any declarations!

>         next if ( ( $name =~ /Block/ ) or ( $name =~ /nobody/ ) or (
> $name =~ /User/ ) or ( $name =~ /^\d/ ) or ( $name =~ /www/ )  or (
> $name =~ /backup/ )  or ( $name =~ /ftp/ )  or ( $name =~ /httpd/ )
> or ( $name =~ /root/ ) or ( $name =~ /netop/ ) or ( $name =~ /sysop/
> ) or ( $name =~ /users/ ) or ( $quota !~ /\d+/ ) or ( $name =~ /^#/ )
> or ( $quota <= 8 ) or ($name =~ /bill/) );
>
> Is there an easier way to loop thru a bunch of regex?

You could do:

    next if $name =~ /Block/;
    next if $name =~ /nobody/;
        :
    next if $name =~ /bill/;

which looks a lot better (and shouldn't be any slower).

Note that you're finding these strings anywhere in
the object string. Is that what you want? Also, have
you considered whether you need a case-sensitive
match?

The checks on $quota aren't quite right. The test

    next if $quota !~ /\d+/

will pass the string 'B52s' no problem, but the test

    next if $quota <= 8

will give you a warning unless you have:

    no warnings 'numeric';

and will evaluate the object string as zero anyway. You
might like:

    next unless $quota =~ /(\d+)/ and $1 > 8;

which will check that the string contains a number, and
if so that it's more than eight, but I don't know what
your data looks like.

This code should do the trick.

    foreach my $userInfo ( split ' ', $buffer )  {

        my ( $name, $quota ) = split /|/, $userInfo;

        next if grep $name =~ /$_/, qw(
                ^# ^\d backup bill Block ftp httpd netop
                nobody root sysop User users www );

        next unless $quota =~ /(\d+)/ and $1 > 8;
    }

but remember the provisos above.

I can't help thinking though, that there's probably
a better set of criteria to 'get rid of the header
info'. Let us see your data format if yu need any
further help.

HTH,

Rob




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to