in reply to check for square-number with a regex

Just an idea, not a solution:

Every square number can be written as sum of consecutive odd numbers:

1 = 1 4 = 1 + 3 9 = 1 + 3 + 5 ...

Maybe you can write a regex that starts by matching one 1, and then always twice more than the previous capture?

Update: I was thinking along the lines of $str =~ m/^(1)((?{$^N})11)*$/ But that doesn't work, because $^N always gets the value of the previous capture, never that of the last match of the current capture... maybe one has to make another capture with a look-around and refer to that? don't know if that works somehow...

Second update

Now this probably counts as cheating, but using an external variable for tracking the captures make it work:

use strict; use warnings; use 5.010; for (1..100) { my $str = '1' x $_; my $prev; say $_, ' ', $str =~ m/^(1)(?{$prev=$^N})(?>((??{$prev})11)(?{$pre +v=$^N}))*$/ ? 'yes' : 'no'; }
Perl 6 - links to (nearly) everything that is Perl 6.