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


in reply to Re: Simple way to skip spaces and # comments
in thread Simple way to skip spaces and # comments

/\G (?: \s++ | \# .*+ )++ /xgc

^^^^ This makes error about recursion limit...

# for f in `seq 40123`; do echo " #alfa beta"; done | perl -e 'use str +ict; use warnings; undef $/; my $s = <STDIN>; print length $s, "\n"; +$s =~ /\G (?: \s++ | \# .*+ )++ /xgc; print pos $s, "\n"; ' 481476 Complex regular subexpression recursion limit (32766) exceeded at -e l +ine 1, <STDIN> chunk 1. 196597

Replies are listed 'Best First'.
Re^3: Simple way to skip spaces and # comments
by ikegami (Patriarch) on Jul 31, 2020 at 14:42 UTC

    If certain things are expected to match more than 32766 times, you need to break it down.

    So if the following exceeds the limit,

    a+
    you have to use
    (?:a{1,32766})+
    So,
    /\G (?: \s++ | \# .*+ )++ /xgc
    becomes
    /\G (?: (?: \s++ | \# .*+ ){1,32766}+ )+ /xgc
    Or maybe even
    /\G (?: (?: (?: \s{1,32766}+ )++ | \# (?: .{1,32766}+ )*+ ){1,32766}+ )+ /xgc