Cuando yo me refiero a sacar del arreglo los coincidentes, quiero decir que voy desalojando los arreglos de búsqueda, pero, desde luego, voy almacenando los encontrados en un nuevo arreglo o estructura de datos.
En el ejemplo que pones, estás imprimiendo esos resultados. Pues a eso me refiero: si dos elementos a comparar les puedo considerar iguales, les imprimo y/o guardo y los elimino de los arreglos de búsqueda (porque ya les he localizado). O al menos la elimino del arreglo de las nuevas calles. El objetivo es ir haciendo el arreglo de las nuevas calles cada vez más pequeño y evitar hacer comparaciones con calles que ya he localizado.
En cuanto a las alternativas, hay en CPAN unos cuantos módulos para hacer comparaciones entre cadenas de texto. Algunos de ellos están al final de la documentación del propio
String::Trigram. Además, agrego String::Diff, String::Alignment, String::Compare, String::CyclicRotation, String::Examine, String::KeyboardDistance, String::LCSS y el último en aparecer, hace unos días,
String::Similarity::Group.
Te cuento que yo mismo tuve que enfrentarme a un problema parecido, cuando había que "casar" nombres de personas de 3 bases de datos distintas, la más pequeña de 200.000 y la más grande de casi 3 millones. Usando diversas técnicas, con los módulos indicados (incluyendo el Soundex, que dio muy buen juego), se redujeron los no coincidentes a 4000, que no hubo manera de casar más que yendo uno por uno. Pero bueno, en unas horas los hicimos coincidir a todos.