No, no lo es. Te vale con probarlo para darte cuento de que algo no funciona.
Debes recordar que cuando lees algo por el teclado, ese "algo" incluye el/los caracteres de nueva línea. Si no los vas a usar, es mejor que los quites con chomp().
En el if() tienes puesto esto:
if (($num =~ /[0-9]+/) and ($num !~ /[a-zA-Z]/)), que quiere decir:
- la condición entera es verdadera si las dos siguientes lo son
- la primera condición es verdadera si $num contiene, en alguna parte dentro de ella, un conjunto de uno o más dígitos
- la segunda condición es verdadera si $num no contiene ningún carácter alfabético normal
La primera parte de la condición puede fallar si el usuario introduce esto: "Juan 23". La expresión regular devolverá verdadero, pero vemos claramente que no es un número.
Y la segunda parte devolverá verdadero aun cuando el usuario introduzca algo que no sea un número: recuerda que si no quitas el carácter de nueva línea, sigue estando dentro de la variable, y como esos caracteres son distintos de los alfabéticos, la expresión regular devolverá verdadero. Así que incluso devolverá verdadero con esta cadena: "Hola", ya que contiene, al final, el carácter de nueva línea.
No sé por qué luego vuelves a leer otra entrada desde el STDIN, a la misma variable.