PadWalker — это ответ на распутывание псевдонимов. Однако почти в любой ситуации, когда PadWalker является ответом, он может быть ответом на неправильный вопрос. Это один из тех модулей, которые используются либо для отладки, либо для поиска выхода после того, как загнали себя в угол. Если он используется как выход из плохого дизайна, возможно, лучше пересмотреть дизайн. В вашем случае ответ, наверное, тот, что уже упоминался: повышение уровня предупреждения до отказа.
Тем не менее, модуль существует, работает и с ним интересно играть.
Поскольку вопрос конкретно задавался о расшифровке или проверке псевдонимов, вот два примера, где PadWalker может сократить псевдоним до исходной переменной:
use strict;
use warnings;
use PadWalker qw( var_name );
my( $var1, $var2, $var3 ) = ( undef, undef, undef );
for ($var1, $var2, $var3) {
warn var_name( 0, \$_ ) . ' is not defined in "for" loop'
if !defined $_;
}
sub foo {
warn var_name( 1, \$_[0] ) . ' is not defined in sub foo()'
if !defined $_[0];
}
foo( $var1 );
Вывод, который дает, будет примерно таким:
$var1 is not defined in "for" loop at mytest.pl line 13.
$var2 is not defined in "for" loop at mytest.pl line 13.
$var3 is not defined in "for" loop at mytest.pl line 13.
$var1 is not defined in sub foo() at mytest.pl line 19.
Обратите внимание, как необходимо указать var_name( 0, ...
внутри цикла for
, тогда как внутри подпрограммы нам нужно вернуться на один дополнительный уровень, используя varname( 1, ...
.
Также, возможно, интересно то, что операторы given/when
не используют псевдонимы, хотя они и создают видимость этого. Следовательно, PadWalker не может отследить переменную, указанную в given(...)
.
person
DavidO
schedule
06.05.2012
for ($var1, undef, $var2) {...
). Но было много раз, когда я не думал, что что-то можно сделать на Perl, и я ошибался. - person mob   schedule 06.05.2012