• ベストアンサー

grep中でデリファレンスするとエラー???

問題を突き止めるため、コードをここまで小さくしましたが、まだエラーが出ます・・・ use strict; $_ = [0, 1]; grep($_ == $$_[0], 0, 1) このコードはgrepの中で$_をデリファレンスしているだけです。 これを実行すると、 Can't use string ("0") as an ARRAY ref while "strict refs" in use というエラーになってしまいます。 ううむ、どこかでシンボリックリファレンスを使っているのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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 エラーになっています。

zyousuke
質問者

お礼

早速のご回答ありがとうございました! エラーの原因が分かりました。 これは私の思いこみによるエラーでした。 私はgrepの外側で設定した$_をgrepの中で参照しようとしましたが、 grep中では$_がgrep専用に局所化されてしまい、あらかじめセットした外側の$_は参照できないのですね。 grep($_ == $$_[0], 3, 4) 私の思いこみでは、この式の最初の$_はgrepがリストを次々に代入するために使う変数で、 次の$$_[0]はgrepの外側で設定した無名配列を参照しようとしているものです。 しかし、実際にはどちらもgrep用の$_なのだと気付かずに、悩んでいました。

すると、全ての回答が全文表示されます。

関連するQ&A