in reply to custom args with perl -an type invocation?

Step 1. Your code, because of the -n, is all wrapped up in a loop. Which means that your "my $type = shift" statement will be executed each time through the loop. It also means that your $type is lexical to each time through the loop. Changing that line to:

our $type; BEGIN { $type ||= shift or die "no type"; }
solves that by creating $type as a global, and only setting it once (using ||=), and doing it before the loop (using BEGIN).

Step 2: fixing the regex. \w is "word" characters, which includes letters and numbers and the _. You probably want [[:alpha:]]. In which case, the total program looks like this:

#!/usr/bin/perl -an our $type; BEGIN { $type ||= shift or die "no type"; } if ( $type eq 'letters' ) { print if $_ =~ /[[:alpha:]]/; } elsif ( $type eq 'numbers' ) { print if $_ =~ /\d/; } else { print "bad type: $type" }
Tested. Hope that helps.

PS: ++ - that's really a cool use for perl, too ;-)