Why doesn't & work the way I want it to?

The behavior of binary arithmetic operators depends on whether they're used on numbers or strings. The operators treat a string as a series of bits and work with that (the string "3" is the bit pattern 00110011). The operators work with the binary form of a number (the number 3 is treated as the bit pattern 00000011).

So, saying 11 & 3 performs the "and" operation on numbers (yielding 1). Saying "11" & "3" performs the "and" operation on strings (yielding "1").

Most problems with & and | arise because the programmer thinks they have a number but really it's a string. The rest arise because the programmer says:

    if ("\020\020" & "\101\101") {
	# ...
    }
but a string consisting of two null bytes (the result of "\020\020" & "\101\101") is not a false value in Perl. You need:

    if ( ("\020\020" & "\101\101") !~ /[^\000]/) {
	# ...
    }

Back to perlfaq4