http://qs321.pair.com?node_id=11122256


in reply to Re: tr operator in eval -- updated
in thread tr operator in eval -- updated

Thanks very much. There is a lot I don't know about perl, and even more so about 'modern' perl since I only dive into programming about once per year. I had in fact discovered the s/char//g trick after making the OP. Those 'set' operations look very useful. I will have to study up on them. In this case I am not (yet) sure they will work, since a suit like "AKQxxx" is valid but one like "AAKxxx" is not. (There is only one Ace of spades for example.) So assuming counting members of the set AKQ would return 3 in both cases(??), but the second is invalid. But no doubt I will find a use for set operations now that I know they are available. pgmer6809 PS. I have 'discovered' (I am sure I am not the first!) that a way to avoid destruction of the original string is to use $& as in $deal =~ s{AKQJ}{$&}xg; will count the number of top cards in $deal, but leave it unchanged: </code> $deal="AQTxx"; $c = $deal =~ s{AKQJ}{$&}xg; print "$c,$deal\n"; output: 2,AQTxx

Replies are listed 'Best First'.
Re^3: tr operator in eval -- updated
by AnomalousMonk (Archbishop) on Sep 27, 2020 at 06:31 UTC
    Those 'set' operations ...

    Please note that the term "set" is used very loosely in this post. :)

    ... a suit like "AKQxxx" is valid but one like "AAKxxx" is not. (There is only one Ace of spades ....)

    This seems like a two-phase problem. Once you verify that a string is in a standard format with, say, no character occuring twice, it may be very easy to count characters unambiguously.

    Within reasonable limits, a single regex could be very handy for verifying that a string:

    • has min to max characters from a given set of characters;
    • that the characters in the string are only from the set;
    • that each character from the set occurs only once in the string; and
    • that the characters in the string are in a required order.

    It may be enough just to verify that no character occurs more than once in a string. For that,
        length $string == uniq split '', $string
    or
        $string !~ m{ (.) (?= .*? \1) }xms
    does the trick.

    And there are many other conceivable approaches, all depending on your precise requirements.

    Update: Added another simple no-repeat test.


    Give a man a fish:  <%-{-{-{-<