Forum Webscript.Ru

Программирование => Perl => Тема начата: polo от 02 Апреля 2001, 23:10:28

Название: Народ, подскажите
Отправлено: polo от 02 Апреля 2001, 23:10:28
Требуется сделать следующее на перле:
Пердаем подпраграмме хеш (например %hesh),
подпрограмма должна изменить некоторые элементы хеша и вернуть измененный хеш.
Кто подскажет решение?
Название: Народ, подскажите
Отправлено: Chs от 03 Апреля 2001, 06:58:22
Цитировать
polo (03-04-2001 00:10):
Требуется сделать следующее на перле:
Пердаем подпраграмме хеш (например %hesh),
подпрограмма должна изменить некоторые элементы хеша и вернуть измененный хеш.
Кто подскажет решение?
В подпрограмму передать ссылку на хеш.
Название: Народ, подскажите
Отправлено: polo от 03 Апреля 2001, 21:17:14
Можно подробнее.
Например имеем следующее:
%hesh=&podprog(%hesh); #предпологается что хеш уже определен
sub podprog {
%hesh=shift;
сдесь изменяем некоторые елементы, как это можно сделать;
return %hesh; #вернуть модифицированный хеш
Название: Народ, подскажите
Отправлено: Chs от 03 Апреля 2001, 21:38:09
Цитировать
polo (03-04-2001 21:17):
Можно подробнее.
Например имеем следующее:
%hesh=&podprog(%hesh); #предпологается что хеш уже определен
sub podprog {
%hesh=shift;
сдесь изменяем некоторые елементы, как это можно сделать;
return %hesh; #вернуть модифицированный хеш
Можно:
my %hash;
&podprog(\\%hash);

sub podprog {
 my $hr=shift;

 $$hr{\'abc\'} = \'edf\';
}
Название: Народ, подскажите
Отправлено: polo от 04 Апреля 2001, 22:31:20
Все равно не могу разобраться, изложу все полностью, кто знает решение напишите пожалуйста код:

#допустим имеем хеш
%hesh (
name => \'ivan \',
first name=> \'badi\',
city => \'Moskva\',
Country => \'Rossia\'
);
#далее иммее подпрограмму
sub podprog {
%hesh =  &edit_hesh(%hesh); #изменяяем хеш
&other(%hesh); #выполняяем другие операции с измененым хешем хешем
}

sub edit_hesh {
#как написать эту подпрограмму так что-бы она изменила #эллементы
#name => \'ivan \',
#first name=> \'badi\',
#на
#name => \'ivan \',
#first name=> \'badi\',
#и вернула измененный хеш
}
Название: Народ, подскажите
Отправлено: Chs от 05 Апреля 2001, 07:10:40
Цитировать
polo (04-04-2001 22:31):
Все равно не могу разобраться, изложу все полностью, кто знает решение напишите пожалуйста код:

#допустим имеем хеш
%hesh (
name => \'ivan \',
first name=> \'badi\',
city => \'Moskva\',
Country => \'Rossia\'
);
#далее иммее подпрограмму
sub podprog {
%hesh =  &edit_hesh(%hesh); #изменяяем хеш
&other(%hesh); #выполняяем другие операции с измененым хешем хешем
}

sub edit_hesh {
#как написать эту подпрограмму так что-бы она изменила #эллементы
#name => \'ivan \',
#first name=> \'badi\',
#на
#name => \'ivan \',
#first name=> \'badi\',
#и вернула измененный хеш
}
Решение чуть выше.:):)
Название: Народ, подскажите
Отправлено: cj от 05 Апреля 2001, 11:35:50
Цитировать
polo (04-04-2001 22:31):
Все равно не могу разобраться, изложу все полностью, кто знает решение напишите пожалуйста код:

#допустим имеем хеш
%hesh (
name => \'ivan \',
first name=> \'badi\',
city => \'Moskva\',
Country => \'Rossia\'
);
#далее иммее подпрограмму
sub podprog {
%hesh =  &edit_hesh(%hesh); #изменяяем хеш
&other(%hesh); #выполняяем другие операции с измененым хешем хешем
}

sub edit_hesh {
#как написать эту подпрограмму так что-бы она изменила #эллементы
#name => \'ivan \',
#first name=> \'badi\',
#на
#name => \'ivan \',
#first name=> \'badi\',
#и вернула измененный хеш
}

1. Кончай баловаться с передачей хеша по-значению.
2. Это делается так:

# Создаем ссылку на анонимный хеш. Значения полей изменить по-вкусу

my $hash = { "Name" => "Ivan", "Country" => "Russia", "City" => "Moscow" };

Main();

# Имя функции - любое :-)
sub Main
{
    AlterHash($hash);
    ChopHash($hash);
}

# Функция, которая что-то делает с хэшем
sub AlterHash($)
{
    my $h = shift();
    $h->{"Name"} = "$h->{\'Name\'}";
    $h->{"City"}   = "$h->{\'City\'}";

    # Все. Возвращать ничего не надо, хеш уже изменен.
}

# Надеюсь, теперь все ясно?
Название: Народ, подскажите
Отправлено: polo от 05 Апреля 2001, 23:20:05
А как в my $hesh поместить %hesh  а то я написал
my $hesh = {%hesh};
и ничего.
Название: Народ, подскажите
Отправлено: polo от 05 Апреля 2001, 23:27:17
Цитировать
polo (05-04-2001 23:20):
А как в my $hesh поместить %hesh  а то я написал
my $hesh = {%hesh};
и ничего.
my $hesh = keys %hesh;
Название: Народ, подскажите
Отправлено: polo от 05 Апреля 2001, 23:34:15
Поставлю вопрос по другому:
%hesh это данные переданные из формы, требуется обработать некоторые поля (удалить хтмл теги), а потом записать результаты в файл, это делает подпрограмма которая разделяет эллементы хеша и вписывает их в файл (el1|el2|и т.д.|). Навернека здесь другое решение.
Название: Народ, подскажите
Отправлено: Chs от 06 Апреля 2001, 07:10:37
Цитировать
polo (05-04-2001 23:34):
Поставлю вопрос по другому:
%hesh это данные переданные из формы, требуется обработать некоторые поля (удалить хтмл теги), а потом записать результаты в файл, это делает подпрограмма которая разделяет эллементы хеша и вписывает их в файл (el1|el2|и т.д.|). Навернека здесь другое решение.
Успокоились и проводим получасовую медитацию на тему "а что же мне ответили?"  с привлечением документации и perldoc perldata. Если не поможет - повторить.
И так до полного просветления.:)
Ведь как это сделать уже ответили два раза два разных человека.
И другой способ наверняка есть!:))
Название: Народ, подскажите
Отправлено: cj от 06 Апреля 2001, 07:41:10
Цитировать
polo (05-04-2001 23:20):
А как в my $hesh поместить %hesh  а то я написал
my $hesh = {%hesh};
и ничего.

А зачем? Создавай сразу указателем на анонимный хеш. А если очень надо, то my $hash = \\%hash;
Название: Народ, подскажите
Отправлено: cj от 06 Апреля 2001, 07:43:57
Цитировать
Chs (06-04-2001 07:10):
Успокоились и проводим получасовую медитацию на тему "а что же мне ответили?"  с привлечением документации и perldoc perldata. Если не поможет - повторить.
И так до полного просветления.:)
Ведь как это сделать уже ответили два раза два разных человека.
И другой способ наверняка есть!:))

perldata не всегда ведет с полному просветлению ;-) По себе знаю. ;-) Тем более когда о указателях (называемый в Перл ссылками) и о кастинге никогда не слышал ;-)
Название: Народ, подскажите
Отправлено: cj от 06 Апреля 2001, 07:53:30
Цитировать
polo (05-04-2001 23:34):
Поставлю вопрос по другому:
%hesh это данные переданные из формы, требуется обработать некоторые поля (удалить хтмл теги), а потом записать результаты в файл, это делает подпрограмма которая разделяет эллементы хеша и вписывает их в файл (el1|el2|и т.д.|). Навернека здесь другое решение.

Ну что тут может быть сложного? :-)

Пример:

use CGI;
my $CGI = new CGI;
my @params = $CGI->param();
my @records;
foreach my $param (@params)
{
my $value = $CGI->param($param);
# Тут со значением параметра сделать все, что угодно :-)
$value = "$value";
push(@records, $value);
}

my $record = join(\'|\', @records);
# Строку $record записать куда надо.

Ты это имел ввиду?
Название: Народ, подскажите
Отправлено: polo от 06 Апреля 2001, 22:36:55
Ну не совсем это, если бы я писал программу с нуля то я бы это решил без проблем, а я хочу модифицировать код другой программы. Возможно ли модифицировать это таким путем как я описал выше.
Название: Народ, подскажите
Отправлено: cj от 07 Апреля 2001, 08:29:04
Цитировать
polo (06-04-2001 22:36):
Ну не совсем это, если бы я писал программу с нуля то я бы это решил без проблем, а я хочу модифицировать код другой программы. Возможно ли модифицировать это таким путем как я описал выше.

Можно. Замени в моем примере где надо $hash на \\%hash :-)