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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странности с инкрементацией строковых переменных, пропадает 0 
V
    Опции темы
spin2
Дата 31.5.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Странная вещь... Если есть такой код
Код

$x='05';
print $x;
$x++;
print $x;


Если его запустить отдельно, то вроде все ок - сначала выводится "05", потом "06".
Но если этот код - кусок программы, то почему-то ноль обрезается, то есть выводится "05", а потом "6". Хотя в самой программе ничего со значениями не происходит до этого (друг другу присваиваются).
С чем это может быть связано?
Или, как вариант, есть ли возможность числа приводить к нужному формату, чтобы и из "5" и из "05" получалось "05"?

Спасибо! 


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
shootnix
Дата 31.5.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Весь прикол в контекстной зависимости самого языка. Можешь попробовать такой код для эксперимента:

Код

my $a = 'abc';
$a++;
print $a;    # результат - abd!


То есть Perl распознаёт твоё число 05 как строку и, соответственно, увелчивает значение именно строки (скорее всего по таблице ASCII). А если этот код является частью программы, то Perl будет смотреть на контекст, если он "числовой", то строка 05 будет восприниматься как число, а для Perl что 05, что 5 - одно и то же. Для наглядности попробуй так:
Код

my $a = '05';
$a +=1;
print $a;    # результат - 6!


То есть в данном примере контекст явно числовой, поэтому 05 превращается в 5. И, как итог из всего сказанного: $a++ не то же самое, что $a+=1 smile

Как быть? Можно попытаться форсировать нужный контекст... 
PM WWW ICQ   Вверх
spin2
Дата 31.5.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В доках написано, что если это строковая переменная, то ноль должен остаться. smile 
Если перед инкрементацией вывод дает 05, то разве этого не достаточно для того, чтобы считать, что это строковая переменная? Гм...
Причем там вообще странно - все дело в цикле, и иногда исчезает ноль, а иногда нет.

Но вообще ушла от проблемы с помощью sprintf. 


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
shootnix
Дата 31.5.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не совсем так. Проблема тут связана с глобальным типом данных в Perl, таким как строка. Некоторые операции над строками нельзя выполнить, как, например, к строке нельзя прибавить число ($a+=1;) и тогда сам Perl автоматически превращает переменную в строку. Об этом много писалось, вот, к примеру, такой вот прикольный пример:
Код

print 2 . 2+2; # результат - 24 :)

То есть, когда Perl удобно, он переделывает число в строку, как в данном примере сначала - нельзя же конкатенировать числа? - Perl представляет их в виде строк. А затем, когда нужно прибавить число к строке, строка становится числом - 22+2 = 24 smile 
PM WWW ICQ   Вверх
vumnik
Дата 3.6.2006, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А затем, когда нужно прибавить число к строке, строка становится числом - 22+2 = 24 smile


А мне всегда казалось, что сначала выполняется операция сложения, а затем только конкатенация. 
PM MAIL   Вверх
shootnix
Дата 3.6.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(vumnik @ 3.6.2006,  08:03)
Цитата

А затем, когда нужно прибавить число к строке, строка становится числом - 22+2 = 24 smile


А мне всегда казалось, что сначала выполняется операция сложения, а затем только конкатенация.

Да? Может быть, но мне думается, что в данном случае эти опреации равнозначны по сути, поэтому выполняются последовательно. 
PM WWW ICQ   Вверх
igorold
Дата 6.6.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



Цитата(shootnix @ 31.5.2006,  20:53)
 вот, к примеру, такой вот прикольный пример:
Код

print 2 . 2+2; # результат - 24 :)

То есть, когда Perl удобно, он переделывает число в строку, как в данном примере сначала - нельзя же конкатенировать числа? - Perl представляет их в виде строк. А затем, когда нужно прибавить число к строке, строка становится числом - 22+2 = 24 smile

Этот пример не прикольный ...  smile 
в нем при любом порядке операций результат один

что 22+2 = 24
что конкатенация 2 и 4 = 24

лучше что-то типа:
Код

print 2 . 7+8;

 smile  


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


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

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


 




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


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

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