qr{^\s*[^#]*\s*sub} #### #!/usr/bin/env perl use v5.26; my $re = qr{^\s*[^#]*\s*sub}; my (@match, @no_match); while () { if (/$re/) { push @match, $_; } else { push @no_match, $_; } } say '*** Matched:'; print for @match; say '*** Not Matched:'; print for @no_match; __DATA__ should match these: sub hello { sub hello { should not match these: #sub hello { # sub hello { # sub hello { # sub hello { #### *** Matched: sub hello { sub hello { *** Not Matched: should match these: should not match these: #sub hello { # sub hello { # sub hello { # sub hello {