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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача переменных в попдрограмму 
:(
    Опции темы
mastercz
Дата 19.8.2009, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хотелось бы передавать переменные в подпрограмму класическим способом тоесть :имя переменной -> значение.
Как я понимаю в перле это можно сделать только через передачу хэш массива. 
Вопрос в следующем... Можно ли (и если можно то как ) внутри подпрограммы преобразовать хэш к виду: имя переменной -> значение.

Что нибудб вроде : 
Код

MySubs(Parameter1=>'1',Parameter2=>'2')

Чтобы в подпрограмме получить:
Код

$Parameter1=1;
$Parameter2=2;


Причем хотелось бы иметь некий универсальный метод перевода (автоматический), дабы не писать каждый раз 
что-то типа:

Код

my $Parameter1=undef;
my $Parameter2=undef;

 foreach $var (keys (%hash)) 
  {
           if($var='Parameter1') {$Parameter1=1;}
          if($var='Parameter2') {$Parameter2=2;}
 }

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


Шустрый
*


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

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



А что мешает в подпрограмме использовать:

sub mysub(

%hash=shift;

my $myvar=$hash['Parameter1']+$hash['Parameter2'];

)

и вызов 
mysub(%myhash);
PM MAIL GTalk Jabber   Вверх
amg
Дата 19.8.2009, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(mastercz @  19.8.2009,  01:30 Найти цитируемый пост)
Можно ли (и если можно то как ) внутри подпрограммы преобразовать хэш к виду: имя переменной -> значение.
Можно, через символические ссылки:
Код
MySub(par1 => 1, par2 => 2);

sub MySub {
  no warnings "once";
  no strict qw(vars refs);
  my %h = @_;
  ${$_} = $h{$_} for keys %h;
  # ...
  print "$par1\n";
  print "$par2\n";
}
Но перлу такое решение не нравится, он ругается, если не заставить его быть покладистее. Гораздо лучше во всех отношениях другое решение, о котором, собственно, говорил dmitryk1:
Код
mysub(par1 => 1, par2 => 2);

sub mysub {
  my %pars = (
    par1 => 0, # умолчаемое значение для par1
    par2 => 0, # для par2
    par3 => 0, # для par3
    @_         # некоторые (или все) параметры перезаписываются заданными
  );
  # ...
  print "$pars{par1}\n";
  print "$pars{par2}\n";
  print "$pars{par3}\n";
}


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


Бывалый
*


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

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



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


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

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


 




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


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

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