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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявление и инициализация переменных 
V
    Опции темы
meridian
Дата 27.11.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще раз привет всем!

Подскажите, можно объявить и инициализировать переменные след образом ?

Код

my ($varS1, $varS2, $varS3) = 0;
my ($varС1, $varС2, $varС3) = 0;
...


Добавлено через 11 минут и 53 секунды
или все таки надо писать так

Код

my ($varS1, $varS2, $varS3) = (0,0,0);
my ($varС1, $varС2, $varС3) = (0,0,0);

PM   Вверх
sir_nuf_nuf
Дата 27.11.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

my ($varS1, $varS2, $varS3) = 0;

В этом случае $varS2, $varS3 будут неопределны, т.е. будут иметь значения undef.
В этом ничего особо плохого нет. 
Перл преобразует undef в пустую строку и 0, если понадобится, хотя и покажет предупреждение.

Код

my ($varС1, $varС2, $varС3) = (0,0,0);

в этом случае все будут по нулям.

Это сообщение отредактировал(а) sir_nuf_nuf - 27.11.2009, 22:59


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
meridian
Дата 27.11.2009, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



С первым случаем так и получилось. Использовал второй.
Спасибо! 
PM   Вверх
sir_nuf_nuf
Дата 28.11.2009, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пожалуйста...
Кстати, если переменных много можно писать так:
Код

my ($a, $b, $i, $j, $tmp, $x, $bug, $flug) = (0) x 20;

где 20 >= количеству переменных.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
meridian
Дата 28.11.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, тема!
PM   Вверх
ad280379
Дата 2.12.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(sir_nuf_nuf @ 27.11.2009,  22:57)
Код

my ($varS1, $varS2, $varS3) = 0;

В этом случае $varS2, $varS3 будут неопределны, т.е. будут иметь значения undef.
В этом ничего особо плохого нет. 
Перл преобразует undef в пустую строку и 0, если понадобится, хотя и покажет предупреждение.
[code=perl]


значение будет иметь false а не undef 
в некоторых случаях преобразование в пустую строку или ноль приводит к получению значения true 

например:
my $str;
if (defined($str)) - вернет false
if ($str)          - вернет false

а вот если будет
my $srt=0 или $str=""
if (defined($str)) - вернет true
if ($str)          - вернет false 

Это сообщение отредактировал(а) ad280379 - 2.12.2009, 19:36
PM MAIL   Вверх
meridian
Дата 2.12.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ad280379 @ 2.12.2009,  18:34)
Цитата(sir_nuf_nuf @ 27.11.2009,  22:57)
Код

my ($varS1, $varS2, $varS3) = 0;

В этом случае $varS2, $varS3 будут неопределны, т.е. будут иметь значения undef.
В этом ничего особо плохого нет. 
Перл преобразует undef в пустую строку и 0, если понадобится, хотя и покажет предупреждение.
[code=perl]


значение будет иметь false а не undef 
в некоторых случаях преобразование в пустую строку или ноль приводит к получению значения true 

например:
my $str;
if (defined($str)) - вернет false
if ($str)          - вернет false

а вот если будет
my $srt=0 или $str=""
if (defined($str)) - вернет true
if ($str)          - вернет false

Полезно, сэнкс.
PM   Вверх
ginnie
Дата 2.12.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ad280379 @  2.12.2009,  19:34 Найти цитируемый пост)
значение будет иметь false а не undef

Смелое утверждение! Но вынужден Вас огорчить, значение будет именно undef. То, что undef в булевом контексте дает false - совершенно справедливо.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ad280379
Дата 2.12.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ginnie @ 2.12.2009,  19:50)
Цитата(ad280379 @  2.12.2009,  19:34 Найти цитируемый пост)
значение будет иметь false а не undef

Смелое утверждение! Но вынужден Вас огорчить, значение будет именно undef. То, что undef в булевом контексте дает false - совершенно справедливо.

не предерайтесь к словам. речь шла о контексте 
PM MAIL   Вверх
ginnie
Дата 2.12.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ad280379, поясните


sir_nuf_nuf, написал, что интерпретатор преобразует значение undef в 0 там где нужно числовое значение и в пустую строку, там, где нужно строковое значение.
Как нужно интерпретировать Вашу фразу

Цитата

значение будет иметь false а не undef

?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ad280379
Дата 2.12.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ginnie @ 2.12.2009,  20:09)
ad280379, поясните


sir_nuf_nuf, написал, что интерпретатор преобразует значение undef в 0 там где нужно числовое значение и в пустую строку, там, где нужно строковое значение.
Как нужно интерпретировать Вашу фразу

Цитата

значение будет иметь false а не undef

?

Цитата

значение будет иметь false а не undef 
в некоторых случаях преобразование в пустую строку или ноль приводит к получению значения true 


просто прочитать все вместе.
к тому же у меня указан контекст if

sir_nuf_nuf  данный контекст не указал

my $dec=1;
my $str;

$result=$str+$dec;
$result=$str.$dec;


Это сообщение отредактировал(а) ad280379 - 2.12.2009, 20:22
PM MAIL   Вверх
ginnie
Дата 2.12.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хорошо, "придерусь" к другой фразе  smile

Цитата

в некоторых случаях преобразование в пустую строку или ноль приводит к получению значения true


Надеюсь, я правильно понял, что речь в ней идет о преобразовании undef?

Можно увидеть пример, подтверждающий Ваши слова? В тех примерах, что Вы приводили не было преобразования undef.

Вот мой пример, показывающий, что преобразования, производимые интерпретатором никак на значение undef в булевом контексте не влияют.

Код

perl -e 'use Devel::Peek; my $test; warn(defined $test ? "defined" : "undef", " ", $test ? "true" : "false"); Dump $test; warn $test + 3; warn(defined $test ? "defined" : "undef", " ", $test ? "true" : "false"); Dump $test;'


Код

undef false at -e line 1.
SV = NULL(0x0) at 0x600e98
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY)
3 at -e line 1.
undef false at -e line 1.
SV = NV(0x640ff0) at 0x600e98
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY)
  NV = 0




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ad280379
Дата 2.12.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ginnie @ 2.12.2009,  20:48)
Хорошо, "придерусь" к другой фразе  smile

Цитата

в некоторых случаях преобразование в пустую строку или ноль приводит к получению значения true


Надеюсь, я правильно понял, что речь в ней идет о преобразовании undef?


нет, не правильно.
речь не идет об использовании функции undef() 
я говорил о разнице применения в зависимости от контекста.

для тек кто не понял сути вашего примера напишу по проще

Цитата

my $str;

undef($srt);
if (defined($srt))
    {
    print "(0) Defined\n";
    }
else
    {
    print "(0) Not Defined\n";
    }

if ($str)
    {
    print "(1) Defined\n";
    }
esle
    {
    print "(1) Not Defined\n";
    }


оба раза "Not Defined"
PM MAIL   Вверх
sir_nuf_nuf
Дата 2.12.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ad280379, давайте расставим все точки на ё, что бы люди могли извлечь пользу из сего треда.
Итак:

1) В обоих случаях $b будет иметь значение undef.
Код

my ($a, $b) = 1;
my (@a, $b) = (1,2,3);


2) переменная, имеющая значение undef при необходимости преобразуется в пустую строку или 0
Код

my $a;  # a is undefined
my $b = 3 + $a;  # b == 3
my $c = 'abc' . $a; # c == 'abc'


3) в перле есть (явно упомянаются в документации) 3 конекста:
 - скалярный
 - списковый
 - void - контекст
часто имеет смысл говорить про:
 - boolean контекст  (в условном выражении)

Как я понимаю (точно знает ginnie) при использовании чего то в boolean контексте, 
это что то сначала оценивается в скалярном контексте, 
а потом полученное значение преобразуется в истину\ложь по описанным правилам.

4) при использовании undef переменной в булевом контексе, ее значение оцениевает в скалярном контексе как 0, 
и следственно как false.  С самой переменной естественно ничего не происходит

5) и неопределнные (undef) и определенные но нуленвые (0 или пустая строка) переменные и пустые массивы
в Boolean контексте оцениваются как false.
что бы различать когда переменная неопределена, а когда она нулевая - есть функция defined.
Код

my ($a, $b) = 1;
if (defined($a)) {print "ok"} # defined($a) == true
if (defined($b)) {print "never"}  # defined($b) == false





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


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

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


 




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


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

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