#perl
Вопрос:
Я профилировал некоторый код, и есть одна функция, которая выделялась, и мне было интересно, есть ли способ ее оптимизировать:
Функция определяется как:
sub convert_arrayref {
if(ref($_[0]) eq 'ARRAY') {
return join(($_[1] || ","), @{$_[0]});
}
else {
return $_[0];
}
}
В большинстве случаев else
блок будет выполняться, и мне было интересно, могу ли я встроить его, а не вызывать функцию. Код вызова выглядит следующим образом:
$data = convert_arrayref($data, 'amp;')
Итак, я изменил код вызова следующим образом:
if ($data eq 'ARRAY') {
$data = join('amp;', $data)
}
Я думал, что это будет равносильно. Однако результаты разные. Мне интересно, не сделал ли я здесь что-то не так.
Комментарии:
1. Вы можете сложить его в одну линию
$data = join( 'amp;', @$data) if ref($data) eq 'ARRAY';
Ответ №1:
Вы получаете разные результаты, потому что вы не повторили функциональность if
предложения. Вам нужно использовать ref, чтобы проверить, является ли ваша переменная ссылкой на массив, и вам нужно уважать переменную:
if (ref($data) eq 'ARRAY') {
$data = join('amp;', @{ $data })
}