鍋あり谷あり

テーマを決めずに適当に書いています。

Perl

perlの意外な動作について気づいたことを。

文字列に対するビット演算

use strict;
$a="33";
print( $a & "7","\n" ); #=> 3
print( $a + "7","\n" ); #=> 40
print( $a & "7","\n" ); #=> 1

最初の print と最後の print は全く同じ式なのに結果が異なる。
文字列に対してビット演算をするのが悪いという話ではあるが、だからといってひどすぎると思う。
$a の前に my がないが、これで警告なしで動作するというのも意外であった。
念の為に書いておくと、変数が $a ではなく $aaa だとちゃんとエラーになり、my が必要になる。

Hashのeach

use strict;
my %h=( apple=>1, banana=>2 );
while ( my @a = each(%h) ) {
  while ( my @a = each(%h) ) {
    print "@a\n"
  }
}

これを実行すると、無限ループになって終わらない。
内側のwhileがなければすぐに終わる。
ループの状態を %h の中に持っているのが原因。


そんなわけで、今のところperlは好きになれない。