2015-12-31 2 views

ответ

2
  • $seq хэш ссылка
  • $seq->{$label} возвращает значение ключа $label в разыменованного хэш
  • Это значение является другой хэш, из которого мы получаем значение $ARGV[4] ключа
    • @ARGV - это массив аргументов командной строки, $ARGV[4] - это элемент индекса 4
  • Все это возвращает ссылку на массив, который разыменованная по @{...}
  • Добавления обратного косых черт в передней превращает его обратно в массив ссылка

Резюме: это ссылка на массив, который является значением из $ARGV[4] ключ в хэш возвращаемый $seq->{$label}, и все это может быть написано ИМХО

my $ref = $seq->{$label}{$ARGV[4]}; 

Borodin's answer См разницу между \@{$ref} и $ref.

+0

Ваше предложение не делает то же самое, что и исходный код, который был отправлен, т. Е. Получить доступ к копии массива по сравнению с фактическим ссылочным массивом. –

+1

@MattJacob: '\ @ {$ ref} == $ ref'. Нет копии – Borodin

+0

@Borodin Спасибо за редактирование! Sloppy me ... –

5

Позволяет переписать его как этот

my $ref = \@{ 

    $seq->{ $label }{ $ARGV[4] } 

} 

внешней my $ref = это назначение. Я полагаю, что это ясно

Тогда @{ ... }разыменовывает содержимое скобок как массив, а затем \ принимает ссылку на это. Ссылка гасит разыменования, так что идентичны к

my $ref = $seq->{ $label }{ $ARGV[4] } 

за исключением того, что разыменования заставит программу умереть с

не является ссылкой на ARRAY

если содержание не относятся к массиву

Теперь у нас есть

$seq->{ $label }{ $ARGV[4] } 

который использует $seq в качестве ссылки на хэш хэш, и использует $label в качестве ключа первого уровня и $ARGV[4] (пятый аргумент командной строки) в качестве второго уровня ключа

Это утверждение было написанный кем-то, кого я буду щедро называть бедным программистом.Я сомневаюсь, что он был предназначен для проверки хэш-значение, представляющее собой ссылку на массив, и по крайней мере $ARGV[4] должен быть скопирован в имени переменной, чтобы прояснять значение

+0

@tom Что вы подразумеваете под новым arrayref? https://eval.in/496018 –

+0

@Tom: Это просто не так, как я пытался объяснить в своем [более раннем комментарии к Мэтту Якобу] ​​(http://stackoverflow.com/questions/34539439/need-help -interpreting-это-Perl-код/​​34540266? noredirect = 1 # comment56822699_34539579). Попробуйте это 'perl -E '$ r = [qw/A B C /]; $ r2 = \ @ $ r; $ r2 -> [2] = q {X}; скажем, qq {$ r @ $ r $ r2 @ $ r2} ''** output **' ARRAY (0x72c530) A B X ARRAY (0x72c530) A B X'. Вероятно, вы думаете о '$ ref2 = [@ $ ref]', который * делает * сделать мелкую копию – Borodin

+0

@Borodin, вы на 100% правы. Я удаляю свой комментарий. – Tom

1
my $ref = \@{$seq->{$label}{$ARGV[4]}}; 

Лучше всего работать с наизнанку порядок работы:

  1. $ARGV[4]: пятый аргумент, передаваемый через командную строку (например, ./perlscript.pl "argument1" "argument2" "argument3" "argument4" "argument5.txt")
  2. $seq->{ $label }{ $ARGV[4]}: это держит реф на массив, мы знаем это, потому что, когда вы пытаетесь разыменовать него путем обертывания его в @{ ... }, в противном случае вы получили бы предупреждение Не ссылка ARRAY. Кроме того, вместо переменных можно также использовать голые строки (например, $seq->{ 'some label' }{ 'some other label'})
  3. @{ $seq->{ $label }{ $ARGV[4] } }: это делает разыменования, как упомянуто в # 3
  4. \@{ $seq->{ $label }{ $ARGV[4] } }: слэш делает его ссылкой снова, уточнив, что ссылка на массив держалось в хэш
  5. my $ref = \@{ $seq->{ $label }{ $ARGV[4] } };: ваш стандартный присваивание переменной

Мы не видели много другого кода, так что трудно сказать, насколько это возможно, потребуется обновить. Обычно вы хотите дезинфицировать свои входы, чтобы не допустить попадания плохих или чрезвычайно больших данных. Кроме того, вы хотели бы сделать его более значимым. $seq может быть последовательностью или чем-то действительно, $label не слишком идентифицируемым, и с помощью любого $ARGV, как вы это делали, обычно означает, что что-то еще не делается в другом месте.

Смежные вопросы