Как насчет разделения строки на один или несколько несловарных символов и подсчета размера результирующего массива?
$ echo "one, two, three" | perl -nE "say scalar split /\W+/"
3
В качестве подпункта, который будет:
# say count_words 'foo bar' => 2
sub count_words { scalar split /\W+/, shift }
Чтобы избавиться от главной проблемы с пробелами, обнаруженной ysth, вы можете отфильтровать пустые сегменты:
$ echo " one, two, three" | perl -nE 'say scalar grep {length $_} split /\W+/'
3
… или побрить входную строку:
$ echo " one, two, three" | perl -nE 's/^\W+//; say scalar split /\W+/'
3