http://www.perlmonks.org?node_id=803019


in reply to Re^3: check for square-number with a regex
in thread check for square-number with a regex

I think you're aware of this solution for anbncn but I'll post it anyway(it uses ??{} blocks and ?{} and is a Perl regex).
$r = qr/^(a+b)(?{ $a = -1+length $^N; })(??{ $b=$a-1;"(b{$b})" })(??{ +"(c{$a})" })/x; sub test { print $_[0] =~ $r ? "matched\n" : "not matched\n"; } test "aaabbbccc"; test "aaaabbbccc"; test "aaaabbbbccc"; test "aaaabbbbcccc"; test "aabbbbcccc"; test "abc"; test "aabbcc";
Result on Perl v5.8.8:
matched not matched not matched matched not matched matched matched

Replies are listed 'Best First'.
Re^5: check for square-number with a regex
by JavaFan (Canon) on Oct 24, 2009 at 11:54 UTC
    I (and others in this thread) explicitely mentioned no using (?{}) and (??{}). Allowing those means you have the full power of Perl available. It would mean that anything you can do in Perl, you can to with a "regular expression", and the question "can I do foo with a regular expression" becomes a non-question.

    And I would have used (?{}) differently anyway. Something like:

    /^(a+)(b+)(c+)$(?(?{length($1) == length($2) && length($2) == length($ +3)})|(*FAIL))/;
    But that's just a fancy way of writing:
    /^(a+)(b+)(c+)$/ && length($1) == length($2) && length($2) == length($ +3);
    And you can solve the "match a square" with:
    /^([0-9]+)$(?(?{sqrt($1) == int sqrt($1)})|(*FAIL))/;
    Or in general, match "whatever" by:
    /^(.*)$(?(?{is_whatever($1)})|(*FAIL))/;
    after writing the appropriate "is_whatever" function.

    But that means the question no longer is "how can I do foo with a regexp", but "how can I do foo in Perl".