Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > странности с инкрементацией строковых переменных


Автор: spin2 31.5.2006, 14:21
Странная вещь... Если есть такой код
Код

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


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

Спасибо! 

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

Код

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

Как быть? Можно попытаться форсировать нужный контекст... 

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

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

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

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

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

Автор: vumnik 3.6.2006, 08:03
Цитата

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


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

Автор: shootnix 3.6.2006, 18:20
Цитата(vumnik @ 3.6.2006,  08:03)
Цитата

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


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

Да? Может быть, но мне думается, что в данном случае эти опреации равнозначны по сути, поэтому выполняются последовательно. 

Автор: igorold 6.6.2006, 10:16
Цитата(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  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)