¿Qué solución va lenta? ¿El código de ejemplo que te he puesto con Set::Scalar?
Internamente, el método intersection() usa
hash. Lo que quizás notas que vaya lento es porque es una subrutina genérica para realizar operaciones lógicas entre conjuntos de valores, mientras que en tu problema solo deseas resolver un problema muy específico.
Sí, la solución sería usar
hash, pero no de la clave, sino de toda la línea (es lo que nos pides en el primer mensaje: comparar líneas enteras).
Lo que puedes hacer es leer el primer fichero entero, metiendo cada línea en un
hash. Luego abres el segundo archivo, leyendo línea a línea, y miras a ver si la línea que estás leyendo está o no en el
hash. Si está, entonces hay una coincidencia, y la grabas al fichero de salida. En los hilos que te indico las soluciones son así, usando
hash (o el operador de coincidencia inteligente
~~).
Tienes información sobre los
hash en muchos sitios.