作者: Bruce.
日時: 2007/9/11(00:49)
Bruce.です。

Kenji Inoue さんは書きました (2007/09/10 23:48):
> 井上です。
> 
> Bruce. さんは書きました:
>> 前回書き忘れましたが、
>> hello-world のようなハイフンつきのものはクォートの必要があります。
>> shift のような予約語と同じも文字列も同様。
>> あと何かあったかなあ?
> 
> 手元の Perl 5.8 では,$hash{shift} では shift の関数呼び出しは実行されない
> ようです。
> 
> my %hash;
> $hash{shift} = 'value';
> print keys %hash; # => shift
> 

そのようですねえ。
perlfaq7で

  Do I always/never have to quote my strings or use semicolons and commas?
    Normally, a bareword doesn't need to be quoted, but in most cases
    probably should be (and must be under "use strict"). But a hash key
    consisting of a simple word (that isn't the name of a defined
    subroutine) and the left-hand operand to the "=>" operator both count as
    though they were quoted:

        This                    is like this
        ------------            ---------------
        $foo{line}              $foo{'line'}
        bar => stuff            'bar' => stuff


という記述があり、shiftは defined subroutine なのでクォートはされない
と思うのですが。じゃあユーザー定義のものならどうか、と確かめてみると

use strict;

my %hash;

sub foo {
  return "hello";
}

sub bar {
   $hash{shift} = 'world';
}

$hash{foo}='xxxx';
bar('moge');

print join ':', keys %hash;

実行結果
shift:foo

はて?
余裕があったらソースに潜ってみます。