Не используйте my
с модификаторами операторов!
Проблема оказалась в вызываемой области. Забыв предупреждение о том, что нельзя использовать my
с модификатором оператора, я написал следующее:
my $each = shift if @_ == 1;
my %params = @_ unless $each;
Первый раз, когда он прошел @_
имел один аргумент. Он присвоил первое значение $each
. Во второй раз, с большим количеством аргументов, он пропустил my
. Таким образом, в текущей области не было никакого объявления, поэтому он просто использовал подпрограмму, которую я назначил в прошлый раз, и ничего не сохранил в %params
, потому что $each
, на который он ссылался , имел значение.
Странно, но, как указала ysth perlsyn предостерегает от такого поведения. Я думаю, что раньше знал это, но забыл об этом за эти годы. Переключение на
my ( %params, $each );
if ( @_ == 1 ) {
$each = shift;
}
else {
%params = @_;
}
сделал свое дело. Он не только устранил проблемы, которые у меня были с другим методом, но и устранил проблемы в search
.