#perl #syntax
#perl #синтаксис
Вопрос:
Приведенный ниже код взят из старого скрипта Perl.
print "%{@{$noss}[$i]}->{$sector} nn";
Как я должен переписать приведенный выше код, чтобы Perl не жаловался на то, что «использование хэша в качестве ссылки устарело»? Я перепробовал всевозможные способы, но я все еще не мог полностью понять, чего хочет от меня компилятор Perl.
Ответ №1:
print "%{@{$noss}[$i]}->{$sector} nn";
должно быть не более чем
print "$noss->[$i]{$sector} nn";
или даже
print "$$noss[$i]{$sector} nn";
без всей этой канители.
Комментарии:
1. Действительно, фальсификация. Наследовать устаревший код никогда не доставляет удовольствия. Какой глоток свежего воздуха. Теперь все ясно. Спасибо.
Ответ №2:
Предполагая, что $ noss является ссылкой на массив ссылок на хэши, вы можете построить правильное выражение, следуя простому правилу замены того, что обычно является массивом или именем хэша (не включая $ / @ /%), выражением, дающим ссылку в фигурных скобках.
Таким образом, ваш элемент массива, как правило, $foo[$i]
, становится ${$noss}[$i]
. Это выражение само по себе является hashref , поэтому для получения элемента из этого хэша вместо $foo{$sector}
вы используете ${ ${$noss}[$i] }{$sector}
.
Это также может отображаться в различных других формах, таких как $noss->[$i]{$sector}
; см. http://perlmonks.org?node=References quick reference для простых для понимания правил.
Ответ №3:
Я согласен с ysth и tchrist и хочу повторить, что $noss->[$i]{$sector}
это действительно лучший вариант для вас. Этот синтаксис более удобочитаем, поскольку он ясно показывает, что $noss
это ссылка и что вы берете из нее $i
-й элемент и, далее, $sector
ключ от этого элемента.
С точки зрения обучения fish, а не выдачи fish: вам следует прочитать perldoc perlreftut
и, в частности, «правила использования». Понимание этих двух «правил использования» вместе с дополнительным «правилом стрелки» (да, всего 3 правила) даст вам гораздо лучшее представление о том, как работать со ссылками.