Как я могу присвоить результат вызова подпрограммы ссылкам на массивы в Perl? - PullRequest
3 голосов
/ 07 октября 2009

Можно ли назначить переменную массива для ссылки на массив вместо скалярных переменных?

Вместо этого:

($a, $b) = some_sub(\@d, \@e);

Я хочу что-то вроде этого:

(@x, @y) = some_sub(\@x1, \@y1);

Если так, как я могу разыменовать это. Где, как в случае с предыдущим, @$xxxx делает для нас.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 07 октября 2009

Вы можете сделать это в 2 шага (фактически 3 строки):

my ($x_ref, $y_ref) = some_sub(\@x1, \@y1);
my @x = @{ $x_ref };
my @y = @{ $y_ref };

Вопрос в том, не проще ли просто отбросить прямые массивы и начать использовать ссылки везде?

4 голосов
/ 07 октября 2009

Ссылка является скалярной (по определению), даже если то, на что она ссылается, не является. Поэтому я не совсем уверен, что вы подразумеваете под «назначить переменную массива для ссылки на массив вместо скалярных переменных». Вы можете push ссылаться на массивы в обычные массивы как члены, а затем просто разыменовывать их. Вы также можете вернуть ссылки из подпрограмм.

Вы можете разыменовать возвращаемое значение подпрограммы в присваивании. Интересно, это то, что вы пытаетесь сделать?

my @array = @{ some_sub() };

Обратите внимание, что, как поясняет Аксеман, это само по себе не очень хорошая идея и не особенно необходимая. Если вы действительно хотите получить элементы из подпрограммы, а затем в массивы, предложение Депеша - это то, что вам нужно.

Я настоятельно рекомендую perldoc perlreftut как введение в ссылки на Perl. Вы также можете посмотреть на perldoc perllol и perldoc perldsc.

Может помочь, если вы объясните, что вы на самом деле пытаетесь сделать и почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...