in reply to Re^4: Incrementing a large number without Math::BigInt
in thread Incrementing a large number without Math::BigInt

Only auto-increment (++) is magical in that fashion and only when the variable is a "string". From perlop:

The auto-increment operator has a little extra builtin magic to it. 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, with carry:
print ++($foo = '99'); # prints '100' print ++($foo = 'a0'); # prints 'a1' print ++($foo = 'Az'); # prints 'Ba' print ++($foo = 'zz'); # prints 'aaa'
The auto-decrement operator is not magical.

DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^6: Incrementing a large number without Math::BigInt
by ikegami (Patriarch) on Apr 26, 2006 at 05:17 UTC

    |, &, ^ and ~ also work on strings.

    >perl -e "print 'A'|'B' C >perl -e "print 'C'&'E' A >perl -e "print 'A'^' ' a

    I wish << and >> did as well.

    Documented in perlop

      Yes, I actually noticed this node while searching for a solution to my problem. But isn't that more of an ASCII feature than a Perl one? I wonder why the deincrementing and bit shifting don't work.

        ASCII has nothing to do with it. You can use those operators on any string of bytes, whether the data is ASCII, the result of inet_aton or a struct to pass to a system call. The operators work independantly of how the data is interpreted.

        Now, $letter ^ ' ' will not toggle the case of the letter in all encodings, but that's a (simple) algorithm that uses ^ and not ^ proper.

        Here's an example which demonstrates that ^ work no matter how the data was encoded:

        use Socket qw( inet_aton inet_ntoa ); my $ip = inet_aton('10.0.0.155'); my $mask = inet_aton('255.255.255.240'); my $broadcast = $ip | ~$mask; print(inet_ntoa($broadcast), "\n"); # 10.0.0.159

        It's definitely a language feature, and I believe an uncommon one. You can't do that in C or Java, for example.