开发者

Perl autoincrement of string not working as before

开发者 https://www.devze.com 2023-03-05 13:43 出处:网络
I have some code where I am converting some data elements in a flat file.I save the old:new values to a hash which is written to a file at the end of processing.On subsequence execution, I reload into

I have some code where I am converting some data elements in a flat file. I save the old:new values to a hash which is written to a file at the end of processing. On subsequence execution, I reload into a hash so I can reuse previously converted values on additional data files. I also save the last conversion value so if I encounter an unconverted value, I can assign it a new converted value and add it to the hash.

I had used this code before (back in Feb) on six files with no issues. I have a variable that is set to ZCKL0 (last character is a zero) which is retrieved from a file holding the last used value. I apply the increment operator ... $data{$olddata} = ++$dataseed; ... and the resultant value in $dataseed is 1 instead of ZCKL1. The original starting seed value was ZAAA0.

What am I missing her开发者_运维知识库e?


Do you use the $dataseed variable in a numeric context in your code?

From perlop:

If you increment a variable that is numeric, or that has ever been used in a numeric context, you get a normal increment. If, however, the variable has been used in only string contexts since it was set, and has a value that is not the empty string and matches the pattern /^[a-zA-Z][0-9]\z/ , the increment is done as a string, preserving each character within its range.


As prevously mentioned, ++ on strings is "magic" in that it operates differently based on the content of the string and the context in which the string is used.

To illustrate the problem and assuming:

my $s='ZCL0'; 

then

print ++$s;

will print:

ZCL1

while

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

prints

1

NB: In other popular programming languages, the ++ is legal for numeric values only.

Using non-intuitive, "magic" features of Perl is discouraged as they lead to confusing and possibly unsupportable code.


You can write this almost as succinctly without relying on the magic ++ behavior:

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

The e flag makes it an expression substitution.

0

精彩评论

暂无评论...
验证码 换一张
取 消