Не понял простейшей вещи в Perl ($var ++ предпологает ведь собой уже инкреминированную переменную)

Модератор: Модераторы разделов

Аватара пользователя
Slowly
Сообщения: 48
ОС: Mandriva и Windows

Не понял простейшей вещи в Perl

Сообщение Slowly »

Вот скриптик :
$var = 1;
print $var++ while $var < 5; # Печать $var с инкрементом

Результат: 1234

Суть вопроса: Откуда в результате единица взялась(???), если печаетается (print) $var++ , а не $var.
Спасибо сказали:
Аватара пользователя
Warderer
Модератор
Сообщения: 1056
Статус: киберпИнгвин на гусеничном ходу
ОС: Debian unstable

Re: Не понял простейшей вещи в Perl

Сообщение Warderer »

Подсказка: попробуйте print ++$var. О результате подумайте.
Читаю вслух с выражением маны - $50/ч + стоимость звонка. Настраиваю сервисы за Вас - $100/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Не понял простейшей вещи в Perl

Сообщение Uncle_Theodore »

Slowly писал(а):
29.08.2007 12:51
Вот скриптик :
$var = 1;
print $var++ while $var < 5; # Печать $var с инкрементом

Результат: 1234

Суть вопроса: Откуда в результате единица взялась(???), если печаетается (print) $var++ , а не $var.

Есть разница между выражениями

print $var++
и
print ++$var

В первом случае переменная сначала печатается, а потом увеличивается на еденицу. Во втором -- сначала увеличивается на единицу, потом печатается.
Спасибо сказали:
Аватара пользователя
Slowly
Сообщения: 48
ОС: Mandriva и Windows

Re: Не понял простейшей вещи в Perl

Сообщение Slowly »

Warderer писал(а):
29.08.2007 13:34
Подсказка: попробуйте print ++$var. О результате подумайте.

Спасибо за подсказку, как раз тот самый ожидаемый результат. Только начал изучать и уже мне язык начинает быть симпатичен :rolleyes:
Но с другой стороны... зачем нужно это? Достаточно задать начальную переменную с нужного числа (а при нуле вообще не обязательно давать значение). И лишь в редких (или не очень редких) случаях начальное значение переменной вычисляется и тогда прежде чем проделывать итерации можно передними выдать её значение а потом уже делать их с инкрементом...
Спасибо сказали:
Аватара пользователя
Slowly
Сообщения: 48
ОС: Mandriva и Windows

Re: Не понял простейшей вещи в Perl

Сообщение Slowly »

Код: Выделить всё

$var=1;
           print $var2=3 unless $var >0;

Результат null, как и ожидалось

Код: Выделить всё

$var=1;
           print $var2=3 unless $var >1;

Результат 3 , как и ожидалось

Код: Выделить всё

$var = 1;
    print $var++ unless $var > 5; # Печать $var с инкрементом


Результат: 1, а ожидалось 12345

Код: Выделить всё

$var = 1;
    print ++$var unless $var > 5; # Печать $var с инкрементом


Результат: 2, а ожидалось 2345

в чём здесь подвох??
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Не понял простейшей вещи в Perl

Сообщение Uncle_Theodore »

Slowly писал(а):
29.08.2007 15:29
в чём здесь подвох??

В отсутствии цикла? Команда print исполняется один раз, как и написано в программе.
Спасибо сказали:
Аватара пользователя
Slowly
Сообщения: 48
ОС: Mandriva и Windows

Re: Не понял простейшей вещи в Perl

Сообщение Slowly »

Спасибо, Дядя Теодор. Т.е. получается что оператор unless не циклический (хм а ведь дествительно :rolleyes: ) ...
Просто с мысли сбил сам пример взятый у Маслова Владимира Викторовича и меня сбила с понталыки именно ++$var по идее там просто должно было быть $var без ++ или всё таки есть смысл в инкрименте?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Не понял простейшей вещи в Perl

Сообщение diesel »

Slowly писал(а):
29.08.2007 16:19
Спасибо, Дядя Теодор. Т.е. получается что оператор unless не циклический (хм а ведь дествительно :rolleyes: ) ...
Просто с мысли сбил сам пример взятый у Маслова Владимира Викторовича и меня сбила с понталыки именно ++$var по идее там просто должно было быть $var без ++ или всё таки есть смысл в инкрименте?

если пример иллюстрирует инкременты, то понятней было бы так:

[vasiliy@beezir ~]$ perl -e '$var=1; print $var++ ."\n" unless $var>5;print "$var\n";'
1
2
[vasiliy@beezir ~]$ perl -e '$var=1; print ++$var ."\n" unless $var>5;print "$var\n";'
2
2

если иллюстрировалось использование unless, то вроде вы уже разобрались.
Спасибо сказали:
Аватара пользователя
Slowly
Сообщения: 48
ОС: Mandriva и Windows

Re: Не понял простейшей вещи в Perl

Сообщение Slowly »

diesel писал(а):
29.08.2007 16:26
Slowly писал(а):
29.08.2007 16:19
Спасибо, Дядя Теодор. Т.е. получается что оператор unless не циклический (хм а ведь дествительно :rolleyes: ) ...
Просто с мысли сбил сам пример взятый у Маслова Владимира Викторовича и меня сбила с понталыки именно ++$var по идее там просто должно было быть $var без ++ или всё таки есть смысл в инкрименте?

если пример иллюстрирует инкременты, то понятней было бы так:

[vasiliy@beezir ~]$ perl -e '$var=1; print $var++ ."\n" unless $var>5;print "$var\n";'
1
2
[vasiliy@beezir ~]$ perl -e '$var=1; print ++$var ."\n" unless $var>5;print "$var\n";'
2
2

если иллюстрировалось использование unless, то вроде вы уже разобрались.


иллюстрировалось именно unless и присутсвие как раз инкремета наводило на мысль, что это тоже циклический оператор, хотя написано было то, что он является противопложностью if ...
Спасибо сказали: