| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > странности с инкрементацией строковых переменных |
| Автор: spin2 31.5.2006, 14:21 | ||
Странная вещь... Если есть такой код
Если его запустить отдельно, то вроде все ок - сначала выводится "05", потом "06". Но если этот код - кусок программы, то почему-то ноль обрезается, то есть выводится "05", а потом "6". Хотя в самой программе ничего со значениями не происходит до этого (друг другу присваиваются). С чем это может быть связано? Или, как вариант, есть ли возможность числа приводить к нужному формату, чтобы и из "5" и из "05" получалось "05"? Спасибо! |
| Автор: shootnix 31.5.2006, 14:46 | ||||
Весь прикол в контекстной зависимости самого языка. Можешь попробовать такой код для эксперимента:
То есть Perl распознаёт твоё число 05 как строку и, соответственно, увелчивает значение именно строки (скорее всего по таблице ASCII). А если этот код является частью программы, то Perl будет смотреть на контекст, если он "числовой", то строка 05 будет восприниматься как число, а для Perl что 05, что 5 - одно и то же. Для наглядности попробуй так:
То есть в данном примере контекст явно числовой, поэтому 05 превращается в 5. И, как итог из всего сказанного: $a++ не то же самое, что $a+=1 Как быть? Можно попытаться форсировать нужный контекст... |
| Автор: spin2 31.5.2006, 16:15 |
| В доках написано, что если это строковая переменная, то ноль должен остаться. Если перед инкрементацией вывод дает 05, то разве этого не достаточно для того, чтобы считать, что это строковая переменная? Гм... Причем там вообще странно - все дело в цикле, и иногда исчезает ноль, а иногда нет. Но вообще ушла от проблемы с помощью sprintf. |
| Автор: shootnix 31.5.2006, 20:53 | ||
Не совсем так. Проблема тут связана с глобальным типом данных в Perl, таким как строка. Некоторые операции над строками нельзя выполнить, как, например, к строке нельзя прибавить число ($a+=1;) и тогда сам Perl автоматически превращает переменную в строку. Об этом много писалось, вот, к примеру, такой вот прикольный пример:
То есть, когда Perl удобно, он переделывает число в строку, как в данном примере сначала - нельзя же конкатенировать числа? - Perl представляет их в виде строк. А затем, когда нужно прибавить число к строке, строка становится числом - 22+2 = 24 |
| Автор: vumnik 3.6.2006, 08:03 | ||
А мне всегда казалось, что сначала выполняется операция сложения, а затем только конкатенация. |
| Автор: shootnix 3.6.2006, 18:20 | ||||
Да? Может быть, но мне думается, что в данном случае эти опреации равнозначны по сути, поэтому выполняются последовательно. |
| Автор: igorold 6.6.2006, 10:16 | ||||||
Этот пример не прикольный ... в нем при любом порядке операций результат один что 22+2 = 24 что конкатенация 2 и 4 = 24 лучше что-то типа:
|