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'; }
|
|---|