Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Передача подпрограмме хэша.


Автор: everyone 26.1.2005, 21:39
Код

my %hash=('a'=>'b');

&share(%hash);

sub share:
   {
   ...;
   }


Как в подпрограмме share найти value(b) хэша, передаваемого этой подпрограмме, зная ключ к этому значению(a)?
Как я понял, подпрограмме передаётся список - "@_", то есть ключ и значение хэша становятся ячейками списка, никак между собой не связанными.
И на всякий случай, скажу для какой цели это нужно:
Подпрограмме передаётся хэш с параметрами, скажем, отображения HTML страницы, где любой ключ - название параметра, а соответствующее значение - значение параметра. Я пробовал передавать значения параметров списком, или скалярами, но они должны идти в определённом порядке,... утомительно.

Что-то похожее я видел в CGI.pm:
Код
use CGI;

$query=new CGI;

print $query->header(-encoding=>'KOI8-R');


функции header тоже передаётся соответсвие ключ=>ячейка, но не хочется лезть в исходники smile.

Есть у кого-нибудь решение моей проблемы? http://smilies.sofrayt.com/^/aiw/help.gif[s]

Автор: Chuck 26.1.2005, 22:10
Это можно сделать так:
1. Неявной передачей ссылки (использование прототипов):
Код

sub f(\%) {
  my $a=$_[0]->{'key'};
}
f(%a);

2. Передачей хэша как массива с четным числом элементов:
Код

sub f {
    my $a={@_}->{'key'};
}
f(%a);

Автор: s_a_s_h_a 27.1.2005, 10:17
Другая запись использования ссылки:

Код

sub func
{
 my $ref=$_[0];
 my %hash=%$ref;
}

my %hash=('a'=>1,'b'=>2);

&func(\%hash);

Автор: dimes 27.1.2005, 11:12
Э.... а почему не подходит такой способ?


Код

&func(%data);

sub func{
my %_data=@_;
}



Автор: GoodBoy 27.1.2005, 15:38
everyone
Я обычно передачу делаю вот так:

Код
my %hash=('a'=>'b');

&share(\%hash);

sub share {
   my $hash = shift;

   print $hash->{'a'};
}

Автор: korob2001 27.1.2005, 22:19
Если передаётся один хеш, то можно получить его и без ссылок простым присваиванием:
Например:
Код

#!/usr/bin/perl -w
use strict;

my %a = ( key1 => "val1",
         key2 => "val2",
         key3 => "val3" );

sub CheckVal2 {
   my %temp = @_;
   print $temp{ key2 }, "\n";
}

# Теперь передадим его в подпрограмму
# и получим значение val2 из него.
CheckVal2( %a );

Насчёт списка ты прав, хеш действительно сохраняется в массив в виде линейного списка, но он не смешивает ключи и значения. Другими словами, список будет примерно таким:
("key2", "val2", "key3", "val3", "key1", "val1")
Здесь стоит обратить внимание на то, что в списке каждое значение стоит справа от своего ключа. Но сами пары расположены не по порядку, но в тоже время это не имеет никакого значения. Вобщем мы получаем точную копию хеша, причём если хеш объявлен как локальный, как в примере выше, то его можно назвать таким же именем как и передавемый подпрограмме.
Проблема возникает только в том случае, если ты передаёшь в подрограмму не один хеш.

Удачи.
Добавлено @ 22:21
dimes - опс.... Извини, просто сначала не заметил того, что ты это уже написал . ;)))))))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)