LINUX.ORG.RU

Поясните за references в Perl, мужики!

 ,


0

2

Приветствую, ЛОР!

Короче, без всякой лирики, вопрос в лоб: «Что предпочтительнее (best practice, так сказать) использовать для работы со структурами в перле: array или arrayref, hash или hashref» ?

Для себя, полагаю, что ref'ы предпочтительнее. Однако, душу гложат сомнения, ибо наверняка взятие по ссылке @$ и %$ занимает лишние такты, нежели если бы я обращался к ним напрямую $[1] или $a{mydata} соответственно.

Какой-то странный вопрос. Передать что-то сложнее скаляра в функцию или из нее можно только по ссылке, так что выбора у тебя как бы нет. А для локальных переменных надобности в ссылках нет.

взятие по ссылке @$ и %$ занимает лишние такты

не заморачивайся, это не сишка

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Передать что-то сложнее скаляра в функцию или из нее можно только по ссылке, так что выбора у тебя как бы нет.

use strict;
use warnings;
use 5.010; #say

sub penis_sub {
  say $_[0];
  say $_[1];
  return (1, 2, 3);
}

my @penis_arr = ("zhopa", "anus");
my @anus_arr = penis_sub(@penis_arr);
say $anus_arr[0];
say $anus_arr[1];

Здесь всё по значению передаётся. Ну и не забываем, что хэш можно превратить в массив и обратно, причём автоматом. И передавать его также можно массивом.

DELIRIUM ★★★★★ ()

наверняка взятие по ссылке @$ и %$ занимает лишние такты, нежели если бы я обращался к ним напрямую $[1] или $a{mydata} соответственно.

Да, я думаю это так.
Доступ к элементу по ссылке, чуть медленней чем доступ к элементу структуры.
Но:
а) это микро-оптимизация которая никакого существенного значения не имеет.
б) кроме доступа к элементам есть ещё передача/приёме параметров, в которых ссылка может быть предпочтительней.

Вобщем можно использовать, что больше нравится и/или больше подходит для конкретной ситуации.

pru-mike ★★ ()
Ответ на: комментарий от DELIRIUM

Здесь всё по значению передаётся.

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

annulen ★★★★★ ()