in reply to Dynamic Regex?

The most obvious problem is your chcking logic. If you want to sequentially check several things you need: sub checkit { if {} if {} if {} return; } not this (which is what you have) sub checkit { if {} elsif {} else {} return; } Your sub exits the if/elsif/else statement if $min is non zero and also $len < $min. BTW: Why you use two ifs here instead of an and to eval these two conditions is beyond me. This is fixed below: sub paramCheck # Returns "" if no error or description of problem(s). { my $lbl = shift; # Field name for error messages my $val = shift; # Value received from the CGI query my $min = shift; # Minimun length; Use >0 for required fields my $max = shift; # Maximum allowed length my $pat = shift; # Regex to validate the data against. my $msg = shift; # Explanation added to error if Regex fails. my $err = ""; # Holds error message my $len = length( $val ); if ( $min and $len < $min ) { { $err .= wes( "$lbl cannot be blank." ); } } if ( $len > $max ) { my $s = $len == 1 ? "" : "s"; $err .= wes( "$lbl is currently $len character$s; " . "; it can only be $max character$s long." ); } if ( $val !~ $pat ) { $err .= wes( "$lbl contains invalid characters; " . "it can only hold $msg." ); } return $err; } I assume you are assigning $pat as so (it won't work otherwise): $pat = m/foo/; Run this if you are unsure of what I am getting at: $pat = "m/foo/"; print "foo1\n" if "foo" =~ $pat; $pat = m/foo/; print "foo2\n" if "foo" =~ $pat; $pat = qr/foo/; print "foo3\n" if "foo" =~ m/$pat/; Passing $pat into a sub is no problem using either of the second two methods above. The first does not work period as you will see if you run it. happy coding tachyon

Replies are listed 'Best First'.
Re: Re: Dynamic Regex?
by chipmunk (Parson) on May 20, 2001 at 20:03 UTC
    tachyon compares three methods of assigning regexes to a variable:
    $pat = "m/foo/"; print "foo1\n" if "foo" =~ $pat; $pat = m/foo/; print "foo2\n" if "foo" =~ $pat; $pat = qr/foo/; print "foo3\n" if "foo" =~ m/$pat/;
    Passing $pat into a sub is no problem using either of the second two methods above. The first does not work period as you will see if you run it.
    The second does not work either. It is equivalent to:
    $pat = ($_ =~ m/foo/); print "foo2\n" if "foo" =~ $pat;
    $pat will be either 1 or the null string, depending on whether $_ matches /foo/. You will see this if you run it and actually examine the value of $pat.
      Dang, you are correct! I never write $foo =~ $pat so as the seeker of wisdom needed to be using this construct I *quickly* checked it to see if it worked using the code posted. As you rightly point out although this appeared to work in my quick test if I had also tested this: $pat = m/foo/; print "big snafu, egg on face, whoops\n" if "bar" =~ $pat; then my error would have stared me in the face! Thanks for pointing out the error, I hate to post wrong advice and usually run a quick test first. Ah well, another day at the monestry, another snippet of wisdom on the road to enlightenment. As a result the original code will need a qr/$pat/ to work. head bowed, duly chastened :-( tachyon PS this is what you need to get it to work. Trust me ;-) $pat = qr/some pattern here/; ... ... ... sub paramCheck # Returns "" if no error or description of problem(s). { ... my $pat = shift; ... ... if ( $val !~ m/$pat/ ) { $err .= wes( "$lbl contains invalid characters; " . "it can only hold $msg." ); } return $err; }