Not quite \w?+ (which could be \w+ just as easily), as that gives you digits as well, which it sounds like you don't want. Instead, use [a-z]+, which matches against variable names (alpha only, in this case). The /gi lets you match all occurrences (g = global) without regard for case (i = ignore case).
If you have to match alphanumerics (eg. a7), then use something like ([a-z]\w*0) instead.
Of course, any problem requiring unique results just shouts out for a hash.
You could try something like this:
use strict;
use warnings;
+
print "Enter expression: ";
chomp(my $expr = <STDIN>);
+
my @vars = ($expr =~ /([a-z]+)/gi);
my %unique = map { $_ => 1 } @vars;
+
printf "Unique variables: %s\n", join(',',keys %unique);
s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
|