• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:redoを実行するとスカラー変数の値がundefになってしまうのはどうしてでしょうか?)

redoを実行するとスカラー変数の値がundefになってしまうのはなぜ?

このQ&Aのポイント
  • Perlのredoステートメントを使用してループ内でスカラー変数を連結するプログラムにおいて、redoを実行するとスカラー変数の値がundefになる現象が発生します。
  • 原因は、redoステートメントが実行されると、ループの先頭行に制御が移るため、$lineの値が再度定義されずにundefとなってしまいます。
  • これにより、chomp()関数やパターンマッチ、print関数などの処理でエラーが発生します。対策としては、redoを実行した後に再度$lineに値を代入することで、undefの問題を回避することができます。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

多分、while の条件部で宣言しているのが原因だと思います。 このような宣言をした場合、多少違いがありますが基本的には while (...) { my $line; } のように宣言したときとほぼおなじ有効範囲を持ちます。 とすると、redo は条件部分の再評価なしにループを再実行するので、 while の括弧の中にある宣言だけが有効になり、代入操作は行われない こととなり、結果として変数の中身は空になる。 ということになっているのではないかと思います。 実際、while (my $line = <FILE>) を my $line; while ($line <FILE>) { とすると、多分期待通りに動いています。 変数の宣言の位置が微妙ですが、このロジックでやるなら 宣言位置をいじるよりないと思います。

tyorotyoro123
質問者

お礼

sakusaker7様へ 連絡が遅れましてすみませんでした。朝お礼しようと思っていたのですが、ここのサイトの更新ができませんでしたので、お礼が遅れて しまいました。改めまして ご回答ありがとうございまいした。 今後は、redoを使用するときは、変数宣言の位置に気をつけていきたい と思います。ありがとうございました。

関連するQ&A