Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача подпрограмме хэша. Как в CGI.pm 
:(
    Опции темы
everyone
  Дата 26.1.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 24.3.2004

Репутация: 1
Всего: 4



Код

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.

Есть у кого-нибудь решение моей проблемы? --Resize_Images_Alt_Text--[s]
--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
Chuck
Дата 26.1.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Сушня
**


Профиль
Группа: Эксперт
Сообщений: 442
Регистрация: 12.12.2003
Где: Узбекистан, Ташке нт

Репутация: нет
Всего: 9



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

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

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

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

PM MAIL WWW GTalk   Вверх
s_a_s_h_a
Дата 27.1.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



Другая запись использования ссылки:

Код

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

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

&func(\%hash);

PM MAIL   Вверх
dimes
Дата 27.1.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 249
Регистрация: 20.7.2004
Где: то около СПБ

Репутация: нет
Всего: 14



Э.... а почему не подходит такой способ?


Код

&func(%data);

sub func{
my %_data=@_;
}



PM ICQ   Вверх
GoodBoy
Дата 27.1.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: нет
Всего: 83



everyone
Я обычно передачу делаю вот так:

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

&share(\%hash);

sub share {
   my $hash = shift;

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



--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
korob2001
Дата 27.1.2005, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



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

#!/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 - опс.... Извини, просто сначала не заметил того, что ты это уже написал . ;)))))))))

Это сообщение отредактировал(а) korob2001 - 27.1.2005, 22:23


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.