Автор Тема: return нескольких массивов  (Прочитано 3202 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
return нескольких массивов
« : 14 Января 2004, 13:02:39 »
При вызове процедуры из модуля:

(@mass1, %mass2) = MyModule(@mass3);

Процедура модуля:

sub MyModule {
    my %temp_mass;
    foreach (@_) {
      if (s///gi) {$temp_mass{$1} .= $_; $_ = \'\'}
    }
return (@_, %temp_mass)
}

Не присваивает значения @mass1 = @_ и %mass2 = %temp_mass, хотя в самой процедуре @_ и %temp_mass определены...

Пришлось изменить немного по другому:

@mass1 = @mass3;
%mass2 = MyModule(@mass1);

sub MyModule {
    my %temp_mass;
    foreach (@_) {
      if (s///gi) {$temp_mass{$1} .= $_; $_ = \'\'}
    }
return %temp_mass
}

При этом я получаю верные значения @mass1 и %mass2,

Но как-нибудь возможно использование первого варианта, либо использовать конструкцию:

@mass1 = @mass3;
MyModule(@mass3, %mass2);

sub MyModule {
    foreach (@_) {
      if (s///gi) {(?) .= $_; $_ = \'\'}
    }
return 1
}

Как выбрать элемент хеша по-умолчанию? при использовании $_{$1} = присваивается значение не $_, а $1, т.е. $_{$1} = $1... как побороть не пойму...

P.S. т.е. я получаю %mass2 но при этом значение ключа получается сам ключ...
« Последнее редактирование: 14 Января 2004, 13:09:31 от Phoinix »

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
return нескольких массивов
« Ответ #1 : 14 Января 2004, 13:23:02 »
Цитировать
Не присваивает значения @mass1 = @_ и %mass2 = %temp_mass, хотя в самой процедуре @_ и %temp_mass определены...

Правильно. Твой хэшик в данном месте становится массивчиком и возвращается совмещенный с другим массивчиком ;)

Цитировать
Как выбрать элемент хеша по-умолчанию?

А нету такого :) Есть текущий, оператором each ты можешь изьять его. Можешь придумать чегонить сам.

Мой огромный совет: Почитай про ссылки я тебе давно об этом говорю. Дело в том, что механизм передачи/приема значений из функция в perl\'е реализован универсальным спобом. Универсальность заключается в том. что программист реализовывает тот способ передачи/приема, который ему больше понравится сам. Но для этого необходимо знать про ссылки. Полистай perldoc perlref или еще что нить.
0 OK, 0:1

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
return нескольких массивов
« Ответ #2 : 14 Января 2004, 13:42:51 »
Цитировать
А нету такого  Есть текущий, оператором each ты можешь изьять его. Можешь придумать чегонить сам.


Извиняюсь, за не точность... я передаю в процедуру хеш, как мне его определить? Точнее как я могу его использовать в самой процедуре, мне нужен не элемент по-умолчанию, а хеш по-умолчанию... элемент у меня как раз таки определен...

Цитировать
Твой хэшик в данном месте становится массивчиком и возвращается совмещенный с другим массивчиком


А я как раз таки думаю и не возвращать ничего, вернуть просто 1, но при этом провести обработку двух массивов: в одном убрать элементы (точнее обнулить), в другой добавить...

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
return нескольких массивов
« Ответ #3 : 14 Января 2004, 14:31:37 »
Еще раз настоятельно рекомендую применить мой совет. Все ответы там.
0 OK, 0:1

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
return нескольких массивов
« Ответ #4 : 14 Января 2004, 15:06:43 »
ondr
Угу... уже применил спасибо...
но вопрос при разименовывании ссылки:

my @array = @$_[0];

выдает ошибку:

Not an ARRAY reference

приходится разименовывать так:

my $link = @$_[0];
my @array = @$link;

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
return нескольких массивов
« Ответ #5 : 14 Января 2004, 15:09:46 »
Все понял...

my @array = @{$_[0]};

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
return нескольких массивов
« Ответ #6 : 14 Января 2004, 15:11:33 »
my @array = @{ $_[0] };

У Perl конечно синтаксический анализатор просто шикарный, но до искуственного интелекта еще далеко ;) Так, что иногда стоит писать максимально точно в соответствии с установленными правилами.
0 OK, 0:1

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28