Передача массивов и хэшей по ссылке

Проблема

Требуется передать функции несколько массивов или хэшей и сохранить их как отдельные сущности. Например, вы хотите выделить в подпрограмму алгоритм поиска элементов одного массива, отсутствующих в другом массиве. При вызове подпрограмма должна получать два массива, которые не должны смешиваться.

Решение

Используйте ссылки на переменные:
array_diff( \@array1, \@аrrау2 );

Комментарий

Ниже показана подпрограмма, получающая ссылки на массивы, и вызов, в котором эти ссылки генерируются:
@а = (1, 2);
@b = (5, 8);
@с = add_vecpair( \@а, \@b );
print "@c\n";
6 10 
sub add_vecpair {      # Предполагается, что оба вектора
                       # имеют одинаковую длину
  my ($x, $y) = @_;    # Скопировать ссылки на массивы
  my @result;
  for (my $i=0; $i < @$x; $i++) {
    $result[$i] = $x->[$i] + $y->[$i];
  }
  return @result;
}
Функция обладает одним потенциальным недостатком: она не проверяет, что ей были переданы в точности два аргумента, являющиеся ссылками на массивы. Проверку можно организовать следующим образом:
unless (@_ == 2 && ref($x) eq 'ARRAY' && ref($y) eq 'ARRAY') {
  die "usage: add_vecpair ARRAYREF1 ARRAYREF2";
}
Если вы собираетесь ограничиться вызовом die в случае ошибки, проверка обычно пропускается, поскольку при попытке разыменования недопустимой ссылки все равно возникает исключение.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: