Передача массивов и хэшей по ссылке
Проблема
Требуется передать функции несколько массивов или хэшей и сохранить их как отдельные сущности.
Например, вы хотите выделить в подпрограмму алгоритм поиска элементов одного массива,
отсутствующих в другом массиве. При вызове подпрограмма должна получать два массива,
которые не должны смешиваться.
Решение
Используйте ссылки на переменные:
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 в случае ошибки, проверка обычно пропускается,
поскольку при попытке разыменования недопустимой ссылки все равно возникает исключение.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|