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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменение глобальной переменной из функции 
V
    Опции темы
zorch
Дата 19.3.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

$a=0;
&test;
&test1;

sub test
{
$a=1;}

sub test1{

print $a;
}

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

Это сообщение отредактировал(а) zorch - 19.3.2006, 12:42
PM MAIL   Вверх
BlackLFL
Дата 19.3.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вы привели неправильный пример, если Вы его запустите, то получите не 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;


Это сообщение отредактировал(а) BlackLFL - 19.3.2006, 12:58
PM WWW   Вверх
sharq
Дата 20.3.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



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

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Phoinix
Дата 23.3.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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 ...; - как раз для глобальных переменных

Это сообщение отредактировал(а) Phoinix - 23.3.2006, 12:52
PM WWW ICQ   Вверх
sharq
Дата 23.3.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



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

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

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Phoinix
Дата 24.3.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



sharq,

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


Лучше vars.pm, чем гемморой с областями видимости...
При том, если мне нужна глобальная(!) переменная, это значит, что мой код будет не на 10 строк... и эта переменная мне нужна не в одной процедуре, иначе мне её проще просто передать по ссылке...
PM WWW ICQ   Вверх
sharq
Дата 25.3.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Phoinix, в принципе ты прав!
Просто и так, и так можно, твой вариант короче.

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


smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Kiber_rat
Дата 25.3.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Код
#!/usr/bin/perl
$a=0;
&test;
&test1;
sub test {
    $main::a=1;
}
sub test1 {
    print "$main::a\n";
}



--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
sharq
Дата 26.3.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



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

$::main


smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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