#perl
#perl
Вопрос:
Я перефакторирую программу Perl, которую я унаследовал. Следующая строка
(! exists $self->{DEVEL}) amp;amp; { @$d = $nsaobj->filter_list(@$d) };
выдает следующее предупреждение…
Useless use of anonymous hash ({}) in void context...
Сначала я хочу понять, что здесь происходит. Я прав, что это просто другой способ написания приведенного ниже утверждения?
if (! exists $self->{DEVEL}) {
@$d = $nsaobj->filter_list(@$d);
}
Мое лучшее предположение заключается в том, что исходная строка работает из-за отложенной оценки, если да, то какой смысл писать ее таким образом?
Во-вторых, почему эта конкретная строка выдает предупреждение «бесполезное использование ..»?
Ответ №1:
Сначала я хочу понять, что здесь происходит. Я прав, что это просто другой способ написания приведенного ниже утверждения?
Да, похоже, что таково намерение исходного кода, однако это не совсем то, что он делает. Предупреждение Perl верно. Первоначальный автор, вероятно, имел в виду написать
(! exists $self->{DEVEL}) amp;amp; do { @$d = $nsaobj->filter_list(@$d); };
do
Здесь важна часть, поскольку она указывает на выполнение последующего блока. Без do
Perl вместо этого создает анонимную ссылку на хэш с содержимым @$d
, но это значение тогда не привязывается ни к какой переменной, отсюда и предупреждение. Это может даже привести к ошибке времени выполнения, если @$d
в конечном итоге получается массив с нечетным числом элементов.
Если есть желание сохранить это как однострочное, это было бы более типичной конструкцией
@$d = $nsaobj->filter_list(@$d) unless exists $self->{DEVEL};
Комментарии:
1. Хороший ответ, спасибо. Если не считать однострочности кода, есть ли веская причина не записывать это как оператор «if»?
2. Не то, что я могу придумать. Если вам все еще нужна однострочная версия, вы могли бы сделать более типичную
@$d = $nsaobj->filter_list(@$d) unless exists $self->{DEVEL};
Ответ №2:
Perl рассматривает часть после amp;amp;
как анонимную ссылку на хэш. Вы можете опустить фигурные скобки {
и }
, поскольку это все равно одна команда, и предупреждение исчезнет.