perl は文字列と文字列、文字列と数値でビット演算することができる。
文字列と数値だと文字列と数値が両方共整数に変換されて、整数と整数のビット演算になる。
文字列と文字列だと、文字ごと(バイトごと?)のビット演算になることと、そうでもないことがある。
具体的には以下のとおり:
# v5.12.4
use strict;
my $a="13e";
my %ha=("13e"=>"13e");
print "--- string & string --\n";
print( ( $a & "24{" ), "\n" ); # 00a。文字ごとに bit演算。
print( ( (keys(%ha))[0] & "24{" ), "\n" );# 00a。同上。
print( ( (values(%ha))[0] & "24{" ), "\n" );# 00a。同上。
print "--- string & number --\n";
print( ( $a & 24 ), "\n" ); # 8。文字を数値化してから bit演算。
print( ( (values(%ha))[0] & 24 ), "\n" ); # 8。同上。
print( ( (keys(%ha))[0] & 24 ), "\n" ); # 8。同上。
print "--- string & string again --\n";
print( ( $a & "24{" ), "\n" ); # 8。さっきと違う
print( ( (keys(%ha))[0] & "24{" ), "\n" ); # 00a。さっきと同じ。
print( ( (values(%ha))[0] & "24{" ), "\n" ); # 8。さっきと違う。
理解し難い。
他にも、hash の イテレーションの振る舞いとか、 $a, $b が特別扱いになっていることとかいろいろあったけど、この、文字列に対するビット演算の記憶がもっとも受け入れがたい気がする。
keys と values で振る舞いが異なることには今日気がついた。バージョンによって振る舞いが変わるかもしれないとも思うが、試していない。
たぶん、文字列とビット演算するなということなんだと思う。