Можно просматривать ход выполнения операций StringSplit
и Cases
, вводя операции "счетчик" в сопоставляемые шаблоны. Следующий код временно показывает два индикатора выполнения: первый показывает количество символов, обработанных StringSplit
, а второй показывает количество слов, обработанных Cases
:
input = ExampleData[{"Text", "PrideAndPrejudice"}];
wordList =
Module[{charCount = 0, wordCount = 0, allWords}
, PrintTemporary[
Row[
{ "Characters: "
, ProgressIndicator[Dynamic[charCount], {0, StringLength@input}]
}]]
; allWords = StringSplit[
ToLowerCase[input]
, (_ /; (++charCount; False)) | Except[WordCharacter]
]
; PrintTemporary[
Row[
{ "Words: "
, ProgressIndicator[Dynamic[wordCount], {0, Length@allWords}]
}]]
; Cases[allWords, (_ /; (++wordCount; False)) | Except[""]]
]
Ключом к технике является то, что шаблоны, используемые в обоих случаях, совпадают с подстановочным знаком _
. Однако этот подстановочный знак защищен условием, которое всегда терпит неудачу - но только до тех пор, пока он не увеличит счетчик как побочный эффект. Условие «реального» соответствия затем обрабатывается как альтернатива.