• ベストアンサー

whileの前の<IN>やその後の処理が理解できません。

whileの前の<IN>やその後の処理が理解できません。 これをわかりやすく書くとどうなるのでしょうか? このような記述方法は、一般的でしょうか? my $line = ""; open(IN, "<", "test.txt") || die "*** err"; while(<IN>){ $line = $_; $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN)); <--- この処理が理解できません。 } よろしくお願いいたします。

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

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

csvかなにかの解析でもしてるんですかね? では順番に $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN)); Perlでは if/unless/while/until/for/ を後置することができます。 それで何がうれしいかというと、それらの条件文の本体がただ一行のときに {}で囲まないでいいということなどがあります。 この例では、 while ($line =~ tr/"// % 2 and !eof(IN)) { $line .= <IN> } と同じ意味になります。 このような条件の後置は ifやunlessではループ内の判定で比較的多用されていると思いますが、 whileやforではあまり見ないですね。 処理内容に関してですが、tr/"// % 2 の結果が0か1かで $line の中にある " が偶数個かそうでないかを判定できます。 この式では奇数個のときにandの右側まで見に行きますがそこで ファイルの終端かどうかを見て、まだデータがあるなら $lineに次の行を連結するということになりますが、 …これバグってませんか? 複数行にわたって"のバランスをとるのを目論んでいるように思えるのですが、 これだと"が偶数個ある行が現れない限り読み込み続けてしまうような…

その他の回答 (1)

  • HotaruT
  • ベストアンサー率17% (5/28)
回答No.2

文法についてはNo.1の方の回答のとおりですので省略します。 $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN)); の処理の意味ですが、 $line =~ tr/"// の演算結果は$line中の " の数になります。 それが奇数で、かつファイル終端でない場合は、 入力の次の行を$lineに連結して、もう一度 " を数えます。 つまり、1行目の " の数が偶数ならばそれで終わりですし、 1行目の " の数が奇数ならば、次に " が奇数個ある行が出るまで連結し続けます。 このwhileを抜けたあとは、ファイル終端でなければ外側のwhileを抜けませんので、 今までの$lineを捨てて続きを行うことになります。 ところで、このプログラムは何をしようとしているのでしょうか。 もしプログラムがこれだけで終わりだとすれば、何も出力をしない無意味なプログラムということになってしまいますが……。 (出力関係を省略して記したのなら失礼しました)