アプリ版:「スタンプのみでお礼する」機能のリリースについて

問題を突き止めるため、コードをここまで小さくしましたが、まだエラーが出ます・・・

use strict;
$_ = [0, 1];
grep($_ == $$_[0], 0, 1)

このコードはgrepの中で$_をデリファレンスしているだけです。
これを実行すると、

Can't use string ("0") as an ARRAY ref while "strict refs" in use

というエラーになってしまいます。
ううむ、どこかでシンボリックリファレンスを使っているのでしょうか

A 回答 (1件)

同じ数字がたくさん出てきてややこしいので説明用に


use strict;
$_ = [1, 2];
grep($_ == $$_[0], 3, 4)
と変更します。エラー原因に関係する変更ではありません。

そもそも$_=[1,2]のままでも $_ == $$_[0] は
$_がリファレンス、$$_[0]はデリファレンスしたリストの先頭要素"1"
と比較すること自体が論理的に変です。言語仕様的にエラーにはなってないですが。

それが、grepで $_が対象リストの各要素に置き換わって、最初は$_="3" となり、
そのリファレンスではない"3"をデリファレンスしようとしたので
Can't use string ("3") as an ARRAY ref while "strict refs" in use
エラーになっています。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました!

エラーの原因が分かりました。
これは私の思いこみによるエラーでした。
私はgrepの外側で設定した$_をgrepの中で参照しようとしましたが、
grep中では$_がgrep専用に局所化されてしまい、あらかじめセットした外側の$_は参照できないのですね。

grep($_ == $$_[0], 3, 4)
私の思いこみでは、この式の最初の$_はgrepがリストを次々に代入するために使う変数で、
次の$$_[0]はgrepの外側で設定した無名配列を参照しようとしているものです。

しかし、実際にはどちらもgrep用の$_なのだと気付かずに、悩んでいました。

お礼日時:2011/08/17 05:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!