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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подключение sub, при подключении переменные в нём пустые 
:(
    Опции темы
AlexanderI
Дата 13.2.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



почему когда подключается sub, то переменные которые находятся в sub равняются нулю ?
Когда вставляеш sub user_set {...} в if ($proverka eq "ok") { сюда }, то всё работает нормально.
Можно ли как-нибудь это победить ?
Вот мой код:

Код

$proverka = "ok";
if ($proverka eq "ok") {#if3
$dbh = DBI->connect("DBI:mysql:database=$db;host=$host","$user","$password");
my $log2 = $dbh->prepare("SELECT * FROM user WHERE (login='bil')");
$log2->execute();
my $usr2 = $log2->fetchrow_hashref();
            &user_set;
$log2->finish();
$dbh->disconnect();
                       }#/if3
sub user_set {
$userlogin = "$usr2->{'login'}";
}

print "1. $userlogin";

--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 13.2.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Переменные объявленные внутри блока как my, будут видны только внутри этого блока, но не из вне. Эти переменные, с лексической областью видимости, живы только до завершения блока, в ктором они были объявлены. Можно конечно возвращать ссылку на эту переменную, тогда она будет жить до завершения программы, а не блока. Но лучше объяви их в пространстве имён пакета.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
BlackLFL
Дата 13.2.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

....

my $dbh = DBI->connect("DBI:mysql:database=$db;host=$host","$user","$password") or die DBI->errstr;
my $userlogin = $dbh->selectrow_array("SELECT userlogin FROM user WHERE login='bil'");

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

1;


Это сообщение отредактировал(а) BlackLFL - 13.2.2006, 22:36
PM WWW   Вверх
nitr
Дата 14.2.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Думаю, если тебе так нужен этот sub то передай ему ссылку на твой хеш.


--------------------
PM   Вверх
AlexanderI
Дата 14.2.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А как это сделать ? Пример кода не подскажешь (никогда такое не делал) ?
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
BlackLFL
Дата 14.2.2006, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

&xxx( $hash->{'key'} );

sub xxx {
my $self = shift;
}


Это сообщение отредактировал(а) BlackLFL - 14.2.2006, 00:35
PM WWW   Вверх
nitr
Дата 14.2.2006, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код


...
  user_set($usr2);
...
sub user_set {
  my $hh = shift;
  $userlogin = "$hh->{login}";
}



--------------------
PM   Вверх
AlexanderI
Дата 14.2.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А не легче просто писать без my. Т.е. не так:
my $usr2 = $log2->fetchrow_hashref();
а вот так:
$usr2 = $log2->fetchrow_hashref();

Какие-нибудь плохие последствия возможны ?

--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
BlackLFL
Дата 14.2.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если Вы хотите освоить азы програмирования (и хороший тон), придеться понять, что такое my, local, our!

Perl дает возможность не использовать их в простых програмах, в C++ с первого дня, знали бы, что это такое!
PM WWW   Вверх
nitr
Дата 14.2.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



AlexanderI, а что сложности чтоль? Вроде точно должно работать, если какие проблемы, пиши, постараюсь помочь, да и BlackLFL поможет smile


--------------------
PM   Вверх
sharq
Дата 14.2.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Цитата(AlexanderI @ 14.2.2006, 14:24 Найти цитируемый пост)
А не легче просто писать без my. Т.е. не так:
my $usr2 = $log2->fetchrow_hashref();
а вот так:
$usr2 = $log2->fetchrow_hashref();

конечно же легче - писать на два символа меньше. smile

Попробуй во всех своих скриптах использовать
Код

use strict;


Тогда поймешь что к чему.

perldoc -f my
perldoc -f our
perldoc -f local
perldoc strict


smile


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


Тим Тоуди



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

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



AlexanderI, попробуйте заставить свои функции не просто выполнять код, а обрабатывать входные данные и отдавать на их основе результат. Вот как следует делать в Вашем случае:

Код

my $usr2 = $log2->fetchrow_hashref();
my $userlogin=user_set($usr2);
...
sub user_set {
   my $usr2=shift;
return $usr2->{'login'};
}
...

Видите разницу?

А процедурное программирование оставим программистам на BASIC.
PM   Вверх
tishaishii
Дата 15.2.2006, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Да что вы заладили, "$user->login('login')", ну не работает так.
Работает вот так:
Код
$check_str #зачем строка?
="${\
    +$user->login('login')
}"


А ещё работает вот так:
Код
sub test {
   my$var=\shift;
   $$var=12;
   +undef
}
my$var;
test $var;
print $var


Ну ещё так:
Код
sub test {
   $_[0]=12;
   +undef
}

my$var;
test $var;
print $var

PM MAIL ICQ Skype   Вверх
nitr
Дата 15.2.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Всё прекрасно работает и мой и до меня...


--------------------
PM   Вверх
BlackLFL
Дата 16.2.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nitr, не обращай внимания.

tishaishii, давай будем писать hello word так

Код

#!/usr/bin/perl

$SIG{__WARN__} = sub { print $^L . substr($_[0], $|, 11) . $" . '!' . $/ };

s[!<.|=?"=><|{][1234567890ab] or srand if ( %SIG, 9, 20/2 | s[/<,$|>] [_warn_] | $^F ) [int rand 3];

seek DATA,(eval<DATA>)*1,$?;$/.=$/;s;;(<DATA>)[1];e;s;[\w\s];;g;y; -/:-@[-`{-};`-{/" -;;s;;"$_\",$.,".($=/$.-9);see;
__DATA__


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


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

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


 




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


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

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