Cuando el operador "m" tiene el indicador/g Y se ejecuta en contexto de lista, devuelve una lista o f subcadenas coincidentes. Así que otra forma de hacerlo sería:
my @ft_matches = $str =~ m/[FT]/g;
my $ft_count = @ft_matches; # count elements of array
Pero eso sigue siendo dos líneas. Otro truco más raro que puede hacer que sea más corto:
my $ft_count =() = $str =~ m/[FT]/g;
El "() =" Las fuerzas de la "m" para estar en el contexto de lista. Asignar una lista con N elementos a una lista de cero variables en realidad no hace nada. Pero cuando esta expresión de asignación se utiliza en un contexto escalar ($ ft_count = ...), el operador "=" derecho devuelve la cantidad de elementos de su lado derecho - exactamente lo que desea.
Esto es increíblemente extraño cuando lo encontré por primera vez, pero el modismo "=() =" es un truco útil de Perl para saber, para "evaluar en contexto de lista, luego obtener el tamaño de la lista".
Nota: No tengo datos sobre cuáles de estos son más eficientes cuando se trata de cadenas grandes. De hecho, sospecho que su código original podría ser mejor en ese caso.
esto debería ser 'my $ ft_count = $ str = ~ tr/FT/FT /;', de lo contrario eliminará los caracteres de '$ str' – Hasturkun
bien, lo omití. aún así puedes quitar los corchetes. – Hasturkun
Cuenta los corchetes. Debe ser 'tr/FT //' – Toto