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


Автор: zorch 19.3.2006, 12:04
Есть большая прога, описывать ее здесь смысла нет, но суть в том что глабальная переменная изменяется в функции. Как это сделать?
Для упрощения ввывожу простой кусок кода.

$a=0;
&test;
&test1;

sub test
{
$a=1;}

sub test1{

print $a;
}

Выводится соответсвенно 0. А нужно чтобы выводилась 1, т.е. sub test должен ИЗМЕНЯТЬ переменную $a. Если кто знает как это сделать. подскажите.

Автор: BlackLFL 19.3.2006, 12:50
Вы привели неправильный пример, если Вы его запустите, то получите не 0 как пишите, а 1 ...

Код

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

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

{
package first;
our $i = 1;
}


{
package second;
$first::i = 3;
our $i = 2;
}

print $first::i;
1;

Автор: sharq 20.3.2006, 16:43
zorch, используй свзяку our + local, our в основной программе, local в функциях.
Подробно смотри perldoc -f our и perldoc -f local.

smile

Автор: Phoinix 23.3.2006, 12:51
BlackLFL,
sharq,

Мудрецы однако...


zorch,

Код

#!/usr/bin/perl -w
use strict;
use vars '$a';

$a = 1;
&test1;
&test2;
exit;

sub test1 {$a = 2}
sub test2 {print $a}


P.S. use vars ...; - как раз для глобальных переменных

Автор: sharq 23.3.2006, 15:19
Phoinix,
Цитата(Phoinix @ 23.3.2006, 13:51 Найти цитируемый пост)
use vars ...

ты видел исходный код vars.pm?
и что лучше our+local или один экран кода vars?

smile

Автор: Phoinix 24.3.2006, 15:52
sharq,

Цитата(sharq @ 23.3.2006, 15:19 Найти цитируемый пост)
ты видел исходный код vars.pm?
и что лучше our+local или один экран кода vars?


Лучше vars.pm, чем гемморой с областями видимости...
При том, если мне нужна глобальная(!) переменная, это значит, что мой код будет не на 10 строк... и эта переменная мне нужна не в одной процедуре, иначе мне её проще просто передать по ссылке...

Автор: sharq 25.3.2006, 16:10
Phoinix, в принципе ты прав!
Просто и так, и так можно, твой вариант короче.

Это из области - при наследовании писать use base '...';, а не use ...; push @ISA, '...';.
Хотя и так, и так можно, просто первый вариант короче! smile


smile

Автор: Kiber_rat 25.3.2006, 21:32
Код
#!/usr/bin/perl
$a=0;
&test;
&test1;
sub test {
    $main::a=1;
}
sub test1 {
    print "$main::a\n";
}

Автор: sharq 26.3.2006, 15:04
Kiber_rat, а зачем писать слово main?
Можно так:
Код

$::main


smile

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