Extract strings from nested array in Perl
Your concept of "string" seems incomplete.  I would look to firm up that definition and precisely match the need.  Is "" a string?  Do you want "valid identifiers" (/^[^\d\W]\w+$/) or "plausible ASCII words"  (/^[A-Za-z]+$/) or just "not numbers"  (!/ ^ ( [+-]? \d* \.? \d+ (?:[Ee][+-]?\d+)? ) $/x)?  

I like use warnings FATAL =&gt; 'all'; so that I don't miss a warning in the midst of other output.  

A fat arrow between arguments of different purpose can enhance readability.

Coding in functional style (with grep and map instead of @output) is a natural fit to this kind of problem.  

Plain old recursion is suited to the task and would obviate the need for experimental features.  

Having extract_strings take a ref (as it does now) and return a list simplifies the logic even further.

print join ', ' =&gt; extract_strings($nested);

sub extract_strings {
    grep /^[a-zA-Z]/ =&gt; map { ref eq 'ARRAY' ? extract_strings($_) : $_ } @{ $_[0] } 
}


If returning a ref is necessary, wrap and unwrap accordingly:

sub extract_strings {
    [ grep /^[a-zA-Z]/ =&gt; map { ref eq 'ARRAY' ? @{ extract_strings($_) } : $_ } @{ $_[0] } ]
}