Bienvenido a los foros de Perl en español, toxperl.
Este problema es tan sencillo de resolver para Perl, que ni siquiera es necesario escribir un programa.
Se puede resolver en una sola línea, desde la misma línea de órdenes:
Using bash Syntax Highlighting
explorer@casa:~/> perl -le '$_=shift; $t=0; while (/1/) {$t += substr($_, $y = index($_,1), rindex($_,1) - $y + 1) =~ tr/01/10/ }; print $t' 1001110001
21
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
Lo que hacemos es un bucle sin fin mientras exista algún '1' en la cadena que pasamos como argumento. Luego buscamos por esos '1' por el principio de la cadena con index(), y por el final con rindex(). Extraemos la subcadena con substr() y se la pasamos a tr///, que es el que hace la transliteración de 0 a 1 y viceversa, devolviendo además el número de veces que lo hace, número que agregamos al contador $t, valor que sacamos al final como resultado del proceso.
Vamos, exactamente lo mismo que lo que hace el código en Java que has publicado... pero con menos líneas