>ハッカ飴 2002/01/28 (月) 08:01:17        [mirai]
> > 今タメしてみたんだが、print <<'EOF'でファイル名の入った変数を
> > フレーム指定するHTMLを吐かせてみると当然ながら変数が展開されず
> > $fileというものがブラウザに出てきてしまうが、print <<EOFとしたら
> > 変数は展開されて、またS-Jisの文字コード原因のエラーも出ずに
> > 動いた。つまりprint <<EOFはprint <<"EOF" ともprint <<'EOF'とも
> > 違うものである模様。
> それは不思議だな。
> そこで引用符を付けないと、""を付けたのと同じになるはずだったのに・・・。
> 新バージョンから変わったのかね?
> 俺が使っているのはperl5.005なんだけど。
> 話のネタに、不思議な理由を書くか。
> エラーというのは全角スペースに@が含まれているからだったな。
> つまり、お前の話だと$は展開されて、@は展開されなかったということになる。
> そんな半端な機能ってあるものなのかどうかが不思議。
> それで、ちょっと調べたら、
> そのエラーメッセージは"In string~"というものじゃないか?
> これは展開した変数が存在しなかったときにだけ出るエラーだそうだ。
> 警告に近いエラーだね。「@var という変数があるが、これは間違いじゃないのかね?」とperlが注意しているから。
> だから、エラーが出たり出なかったりしたのはこのせいじゃないのかって思うんだけど、どうよ?

またしても、偉大なハッカ飴さんに理解する楽しみを減らさないよう
気の効いたのヒントをもらったので早速試してみたらその通りでした。

つまり、print <<EOFと何もクオートしなかった時にエラーが出ずに
変数展開はされていたのだが、そのヒアドキュメントの中に「 color4」と
全角スペース+存在しない配列名になる文字列を入れてみたら
In string, @4 now must be written as \@4 at chat.cgi line 254, near "@color4"
とのエラーが。そこで全角スペース+別の場所で使用して存在している配列名
「 color1」という文字列をヒアドキュメントに入れてみたら普通に@color1の
配列の要素が展開されて出力されました。

偉大なるハッカ飴の言うとおりエラーが出たり出なかったしたのはこの
「存在しない配列名の時にエラーが出る」ということで、
print <<EOF; は print <<"EOF";と等価で上に違うっぽいと
漏れが書いたのは全くの勘違いでした。

ちなみに文末とかに「 」と全角スペース単体である場合はエラーにならな
かったので、「全角スペースあるのにエラーでねけな」と思ったのが勘違い
の直接の原因です。

偉大なハッカ飴の直レスとても嬉しいです

参考:2002/01/27(日)01時43分25秒