in reply to how should i test whether a string contains between 6 and 20 letters and numbers

use strict; use warnings; while (<DATA>) { chomp; if (/^[a-zA-Z0-9]{6,20}$/) { print "Success: >$_<\n"; } else { print "Invalid string: >$_<\n"; } } __DATA__ Success Invalid string!

Prints:

Success: >Success< Invalid string: >Invalid string!<

Update: provide complete sample


DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^2: how should i test whether a string contains between 6 and 20 letters and numbers
by brian_d_foy (Abbot) on Jan 30, 2006 at 00:17 UTC

    Your solution allows for a trailing newline. Try it with this string:

    $_ = "abcdefghijklm\n\n";

    You can fix that up with the \z anchor :)

    --
    brian d foy <brian@stonehenge.com>
    Subscribe to The Perl Review

      My sample code (the solution is actually the regex /^[a-zA-Z0-9]{6,20}$/) removes trailing line seperators (however they may currently be defined). A blank line will comprise two consecutive line seperators and will result in an invalid string being detected - which is consistent with OP's criteria (and original code).

      Note that at least part of the rationale for posting a "complete sample" is to show others with a technique for providing stand alone code to demonstrate a problem or solution. The line handling code is incedental to the OP's question, but is an important part of a technique for providing test data.

      Hmm, ok I'll go get that coffee now :)


      DWIM is Perl's answer to Gödel

        Actually, a blank line has only one line separator (like any other line). It just happens it doesn't have anything before it. Your solution removes a single line separator: take a look at the docs for chomp again-you have to be in paragraph mode to remove all trailing newlines. There's nothing to say that there might be more than one of those. That your solution is consistent with the OP's similarly broken code is little consolation.

        Your solution misses because you make assumptions about the input, and those aren't warranted. You can fix that with \z, which makes the regex do exactly what the poster wanted and takes so little effort, and best of all, doesn't assume anything else about the provenance of the input. Are you arguing against something that absolutely solves the problem over something that might not when the clever cracker or ill designed program tries to get around it?

        C'mon, the fix is simple. Just use it and be right. :)

        --
        brian d foy <brian@stonehenge.com>
        Subscribe to The Perl Review