![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| spin2 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 15.12.2005 Где: Москва-Одесса Репутация: нет Всего: 31 |
Странная вещь... Если есть такой код
Если его запустить отдельно, то вроде все ок - сначала выводится "05", потом "06". Но если этот код - кусок программы, то почему-то ноль обрезается, то есть выводится "05", а потом "6". Хотя в самой программе ничего со значениями не происходит до этого (друг другу присваиваются). С чем это может быть связано? Или, как вариант, есть ли возможность числа приводить к нужному формату, чтобы и из "5" и из "05" получалось "05"? Спасибо! -------------------- |
|||
|
||||
| shootnix |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Весь прикол в контекстной зависимости самого языка. Можешь попробовать такой код для эксперимента:
То есть Perl распознаёт твоё число 05 как строку и, соответственно, увелчивает значение именно строки (скорее всего по таблице ASCII). А если этот код является частью программы, то Perl будет смотреть на контекст, если он "числовой", то строка 05 будет восприниматься как число, а для Perl что 05, что 5 - одно и то же. Для наглядности попробуй так:
То есть в данном примере контекст явно числовой, поэтому 05 превращается в 5. И, как итог из всего сказанного: $a++ не то же самое, что $a+=1 Как быть? Можно попытаться форсировать нужный контекст... |
||||
|
|||||
| spin2 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 15.12.2005 Где: Москва-Одесса Репутация: нет Всего: 31 |
В доках написано, что если это строковая переменная, то ноль должен остаться.
Если перед инкрементацией вывод дает 05, то разве этого не достаточно для того, чтобы считать, что это строковая переменная? Гм... Причем там вообще странно - все дело в цикле, и иногда исчезает ноль, а иногда нет. Но вообще ушла от проблемы с помощью sprintf. -------------------- |
|||
|
||||
| shootnix |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Не совсем так. Проблема тут связана с глобальным типом данных в Perl, таким как строка. Некоторые операции над строками нельзя выполнить, как, например, к строке нельзя прибавить число ($a+=1;) и тогда сам Perl автоматически превращает переменную в строку. Об этом много писалось, вот, к примеру, такой вот прикольный пример:
То есть, когда Perl удобно, он переделывает число в строку, как в данном примере сначала - нельзя же конкатенировать числа? - Perl представляет их в виде строк. А затем, когда нужно прибавить число к строке, строка становится числом - 22+2 = 24 |
|||
|
||||
| vumnik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 30.5.2006 Репутация: нет Всего: нет |
А мне всегда казалось, что сначала выполняется операция сложения, а затем только конкатенация. |
|||
|
||||
| shootnix |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 3.9.2005 Где: Казахстан Репутация: 2 Всего: 2 |
Да? Может быть, но мне думается, что в данном случае эти опреации равнозначны по сути, поэтому выполняются последовательно. |
||||
|
|||||
| igorold |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 3 Всего: 17 |
Этот пример не прикольный ... в нем при любом порядке операций результат один что 22+2 = 24 что конкатенация 2 и 4 = 24 лучше что-то типа:
-------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
||||||
|
|||||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |