4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

perl の不思議な振る舞い

4
Last updated at Posted at 2013-02-05

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 が特別扱いになっていることとかいろいろあったけど、この、文字列に対するビット演算の記憶がもっとも受け入れがたい気がする。

keysvalues で振る舞いが異なることには今日気がついた。バージョンによって振る舞いが変わるかもしれないとも思うが、試していない。

たぶん、文字列とビット演算するなということなんだと思う。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?