Bien. Esto es feo Tenía una publicación medio preparada que explicaba esto como un error en warnings
, y luego me di cuenta de que no, es realmente una malvada sutileza en el modo en que funciona warnings
.
Las advertencias comienzan a buscar un marco de pila relevante para obtener los bits de advertencia del llamante del llamante de la persona que llama. La idea es que esté escribiendo algún módulo y use warnings::warn
o warnings::warnif
en sus funciones, y si la advertencia se imprime (o es fatal) depende de la configuración use warnings
en el alcance en el código que usa su módulo. No hay ninguna opción para que comience en caller(1)
en lugar de caller(2)
, por lo que el efecto que desea no es posible.
Un ejemplo de código que hace el trabajo (y demuestra cómo se espera que esta interfaz para ser utilizado por quien lo escribió):
package Foo;
require warnings;
sub bail {
warnings::warnif('numeric', "You fool! You divided by zero!");
}
package main;
use warnings FATAL => all;
Foo::bail();
print "Will never be reached\n";
Y no se puede derrotar a la forma en que funciona con sólo añadir otro nivel de subrutinas, porque toma las banderas de la primera llamada que está en un paquete diferente de la persona que llama de warn
/warnif
/enable
/etc.
Una advertencia lo suficientemente grave como para ser fatal suena como un * error * para mí. Esta es la diferencia, las advertencias * no son * fatales. – pavium
@pavium: hay una distinción, pero las advertencias de la opción FATAL de pragma tienen la intención de promover las advertencias a los errores. – ysth