Когда оператор "m" имеет флаг / g и выполняется в контексте списка, он возвращает список совпадающих подстрок. Так что еще один способ сделать это будет:
my @ft_matches = $str =~ m/[FT]/g;
my $ft_count = @ft_matches; # count elements of array
Но это все еще две строки. Еще один странный трюк, который может сделать его короче:
my $ft_count = () = $str =~ m/[FT]/g;
"() =" заставляет "m" находиться в контексте списка. Присвоение списка с N элементами списку нулевых переменных на самом деле ничего не делает. Но затем, когда это выражение присваивания используется в скалярном контексте ($ ft_count = ...), правый оператор «=» возвращает количество элементов из его правой стороны - именно то, что вы хотите.
Это невероятно странно, когда впервые встречается, но идиома "= () =" - полезный трюк на Perl, который нужно знать для «оценки в контексте списка, а затем получения размера списка».
Примечание. У меня нет данных о том, какие из них более эффективны при работе с большими строками. На самом деле, я подозреваю, что ваш оригинальный код может быть лучшим в этом случае.