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


Автор: AlexanderI 13.2.2006, 21:43
почему когда подключается 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";

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

Автор: BlackLFL 13.2.2006, 22:36
Код

#!/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;

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

Автор: AlexanderI 14.2.2006, 00:21
А как это сделать ? Пример кода не подскажешь (никогда такое не делал) ?

Автор: BlackLFL 14.2.2006, 00:34
Код

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

sub xxx {
my $self = shift;
}

Автор: nitr 14.2.2006, 01:10
Код


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

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

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

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

Perl дает возможность не использовать их в простых програмах, в C++ с первого дня, знали бы, что это такое!

Автор: nitr 14.2.2006, 14:08
AlexanderI, а что сложности чтоль? Вроде точно должно работать, если какие проблемы, пиши, постараюсь помочь, да и BlackLFL поможет smile

Автор: sharq 14.2.2006, 14:35
Цитата(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

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

Код

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

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

А процедурное программирование оставим программистам на BASIC.

Автор: tishaishii 15.2.2006, 02:42
Да что вы заладили, "$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

Автор: nitr 15.2.2006, 18:48
Всё прекрасно работает и мой и до меня...

Автор: BlackLFL 16.2.2006, 10:39
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__


Автор: nitr 16.2.2006, 12:22
BlackLFL, =)

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