Daß ein undef genau so behandelt wird wie q{} ist ok. Das erwartet man im Allgemeinem von einem Template, daß es damit umgehen kann.
Wenn man mit param(...) weniger vorgibt, als man verwendet, dann ist das ein Fehler, der z.B. dann entsteht, wenn man ein Template neu aufsetzt. Anders herum passiert es, wenn man ein vorhandenes Template anpaßt. Das zusätzliche Parametrisieren ist zwar nicht wirklich ein Problem, jedoch leidet die Performance. Beides zusammen entsteht, wenn man sich verschreibt.
Ich weiß zwar nicht, wie Dein Template genau funktoniert. Der Einfachste Fall ist, wenn Parameter in einem Hash gehalten werden, daß man diesem eine Art Tie::StrictHash verpaßt und schon könnte man falsche keys erkennen/registrieren. Das Ein- und Ausschalten (tie oder nicht tie) ist einfach und abgeschaltet ist das Programm so, wie es immer war. Der andere Fall ist das Zählen der Zugriffe am Ende und das Filtern der mit 0 gezählten. Das würde ich auch auch mit in den tie reinpacken.
Um so etwas zu implementieren, würde ich mein Template (wenn ich eins geschrieben hätte) nicht so abwandeln, daß es im nicht-strict Modus Performanceverluste hätte. Denn sonst würde ich (steffenw) am Ende sagen: Das habe ich nicht gewollt.
Das mal so als Gedanken dazu.\n\n
<!--EDIT|steffenw|1167422384-->
$SIG{USER} = sub {love 'Perl' or die};