in reply to Re^4: how should i test whether a string contains between 6 and 20 letters and numbers
in thread how should i test whether a string contains between 6 and 20 letters and numbers

I must be being particuarly dense today because I just don't understand where you are coming from with this!

Consider the following two variants of the code I posted:

Given: __DATA__ Success Invalid string! ... { if (/^[a-zA-Z0-9]{6,20}\z/) { ... prints: Invalid string: >Success < Invalid string: > < Invalid string: >Invalid string! < and ... { chomp; if (/^[a-zA-Z0-9]{6,20}\z/) { ... prints: Success: >Success< Invalid string: >< Invalid string: >Invalid string!<

Where is the problem? At the end of the day both variants tag the invalid strings invalid and the valid string valid. For the sample code the \z variant with no chomp prints the line end characters from the input data - but that was not important to the sample code, in fact it is distracting.

We have no information about why OP needs this code (although validating passwords does seem likely) and it's not clear to me what assumptions I am making that would cause a clever cracker to continue his career. Would you care to sketch a scenario showing how the solution is substandard?


DWIM is Perl's answer to Gödel
  • Comment on Re^5: how should i test whether a string contains between 6 and 20 letters and numbers
  • Download Code

Replies are listed 'Best First'.
Re^6: 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 03:24 UTC

    The problem is that we have no idea where the data is coming from, but your solution constrains it to reading from the DATA filehandle. Your solution only works for those cases. If the string comes from a different source that doesn't process things by lines then your regular expression fails. It only works because you constrain the source of input. However, by making my simple change, you don't have to care about that. I've already shown you a string that broke your solution. Take any of the other infinite number of ways to get data inside a scalar and you'll have your example.

    Why fight it? If you only want a-zA-Z0-9 in the string, why use a regular expression that would allow something else?

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

      Finally I understand your issue, and you are quite right. My regex using $ ignores a single trailing new line character. Vis:

      use strict; use warnings; my @strs = ("abcdefghijklm\n\n", "abcdefghijklm\n"); for (@strs) { if (/^[a-zA-Z0-9]{6,20}$/) { print "Success: >$_<\n"; } else { print "Invalid string: >$_<\n"; } }

      Prints:

      Invalid string: >abcdefghijklm < Success: >abcdefghijklm <

      If your first reply had said:

      Your solution ignores a trailing newline. Try it with this string: $_ = "abcdefghijklm\n";

      I'd have understood your concern straight off. If there was anyone else remaining confused I hope the issue is now clear and that they have learned something, as I have.


      DWIM is Perl's answer to Gödel