Perl автоинкремент строки не работает, как раньше - PullRequest
1 голос
/ 13 мая 2011

У меня есть код, где я преобразую некоторые элементы данных в плоский файл. Я сохраняю старые: новые значения в хеш, который записывается в файл в конце обработки. При выполнении подпоследовательности я перезагружаю в хеш, чтобы я мог повторно использовать ранее преобразованные значения в дополнительных файлах данных. Я также сохраняю последнее значение преобразования, поэтому, если я сталкиваюсь с не преобразованным значением, я могу присвоить ему новое преобразованное значение и добавить его в хеш.

Я использовал этот код раньше (еще в феврале) на шести файлах без проблем. У меня есть переменная, которая установлена ​​в ZCKL0 (последний символ - ноль), которая извлекается из файла, содержащего последнее использованное значение. Я применяю оператор приращения ... $ data {$ olddata} = ++ $ dataseed; ... и результирующее значение в $ dataseed равно 1 вместо ZCKL1. Исходное начальное значение семян было ZAAA0.

Что мне здесь не хватает?

Ответы [ 3 ]

6 голосов
/ 13 мая 2011

Используете ли вы переменную $dataseed в числовом контексте в вашем коде?

С perlop :

Если вы увеличиваете переменную, которая является числовой или когда-либо использовалась в числовом контексте, вы получаете нормальное приращение.Однако, если переменная использовалась только в строковом контексте с момента ее установки, и имеет значение, которое не является пустой строкой и соответствует шаблону / ^ [a-zA-Z] [0-9] \ z /, приращение выполняется в виде строки, сохраняя каждый символ в пределах своего диапазона.

0 голосов
/ 13 мая 2011

Вы можете написать это почти так же кратко, не полагаясь на магическое поведение ++:

s/(\d+)$/ $1 + 1 /e

Флаг e делает его заменой выражения.

0 голосов
/ 13 мая 2011

Как уже упоминалось, ++ on strings - это «волшебство» в том смысле, что он работает по-разному в зависимости от содержимого строки и контекста, в котором используется строка.

Чтобы проиллюстрировать проблему и предположим:

my $s='ZCL0'; 

, тогда

print ++$s;

напечатает:

ZCL1

, а

$s+=0; print ++$s;

печать

1

Примечание: в других популярных языках программирования ++ допустим только для числовых значений.

Использование неинтуитивных, "магических" функций Perl не рекомендуется, поскольку они приводят к запутанному и, возможно, неподдерживаемому коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...