Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Возврат изменённого значения из sub


Автор: vax1700 19.3.2006, 13:15
Есть sub:
Код

sub get_word_id {
        my ($word, $count, %words_array) = @_;
...

$count++;
....
return ...;



Вызываю так:
Код

my $id = &get_word_id($word,$words_count,\%words_array);


В процессе исполнения get_word_id выполняется запрос в БД, возвращается id, и инкрементируется $count.
Нужно вернуть изменённые $count и %words_array в тело родительской функции. Как это сделать?
Как бы я не пытался, у меня всё время $words_count = 0, хотя в подпрограмме оно изменяется.

В php так всё просто, а в перле решение, как оказалось, на поверхности совсем не лежит smile
Добавлено @ 13:15
В FAQ смотрел, там такого нет. Кстати неплохой вопрос для FAQ ИМХО.

Автор: BlackLFL 19.3.2006, 13:53
Код

#!/usr/bin/perl
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser); # For debuging

print "Content-type: text/html\n\n";

my $word;
my @words_array = ( "xx", "zz", "yy");
my $id = 1;

sub get_word_id {
    my ($word, $count, $array) = @_;
    
    # Изменяем значение у массива @words_array с zz на aa
    @$array[1] = "aa";
    
    # Увеличиваем инкремент
    $count++;
    
    return $count;
}


$id = get_word_id( $word, $id, \@words_array );

print "<br>". join " ", @words_array;
print "<br>". $id;
1;

получаем
Цитата

xx aa yy
2

Автор: vax1700 19.3.2006, 14:09
2BlackLFL

Так-то понятно, что отработает.
Ты инкрементируешь значение $count и возвращаешь его через return.
А мне надо через return совсем другое значение вернуть.
А $count и массив вернуть тоже изменёнными, т.е. способ с return не катит.
Добавлено @ 14:11
Т.е. грубо говоря, мне нужно вернуть 3 значения, которые могут быть изменены в sub.

В php так всё просто:
Код

$id = $this->sub($query, &$words_array, &$words_count);
и всё.

Автор: BlackLFL 19.3.2006, 14:27
Цитата(vax1700 @ 19.3.2006, 15:09 Найти цитируемый пост)
А мне надо через return совсем другое значение вернуть.

какое? Вы нигде не упоминаете какое!

Код

#!/usr/bin/perl
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser); # For debuging

print "Content-type: text/html\n\n";

my @words_array = ( "xx", "zz", "yy");
my $id = 1;

sub get_word_id {
    my ($count, $array) = @_;
    
    # Изменяем значение у массива @words_array с zz на aa
    @$array[1] = "aa";
    
    # Увеличиваем инкремент
    $$count++;
    
    my $var = "Hello";
    
    return $var;
}


my $value = get_word_id( \$id, \@words_array );

print "<br>". join " ", @words_array;
print "<br>". $id;
print "<br>". $value;
1;

Я вам дал ответ на поставленый вопрос... либо перефразируйте вопрос.

Автор: vax1700 19.3.2006, 14:33
Всё, теперь ясно.
мне не хватало:

Цитата(BlackLFL @ 19.3.2006, 14:27 Найти цитируемый пост)
$$count++;

Спасибо!

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