forでは$.はカウントされない
ちょっと違うので横から。
これはforの動作というより、式の評価コンテキストの問題。
forはその性質上、操作対象は配列になる:
for (<>) { .... } <span style="color: #666"># ~J~X~A~A~S~B~L~A~P~L~I</span> my @lines = <>; for(@lines) { .... }
なので、<>も配列として評価されるべく*まず最初に*<>を最後まで読み切って、行区切りの配列を作ってからforに渡す。このときファイルハンドルを読み切っているので、当然 $.はファイル全体の行数になる。
これに対して、whiileは対象を毎ループ評価するので、1行ずつの読み込みになる。だから$.は行毎の値になる。B::Deparseを使うとちょっとわかるかも。
<span style="color: #666"># ~A~S~A~A~A~A~B~G~A~A正~[~B~O~A~K~B~J~A~A~O~A~D~A~A~@~]~A~F~A~Q~A~C~C~C</span> daisuke@beefcake $ perl -MO=Deparse -e 'print $. . $_ for <>' ; print $. . $_ foreach (<ARGV>); -e syntax OK <span style="color: #666"># ~A~S~A~B~I~A~A $_ = <argv>~A~A~D~A~F~S~M~\~A~A~A~A~A~D~B~K~A~A~@~A1~L~N読~A込~B~S~A~B~K~A~A~L # ~A~A~A~M~B~J~B~O~A~K~B~K~@~B</argv></span> daisuke@beefcake $ perl -MO=Deparse -e 'print $. . $_ while <>' print $. . $_ while defined($_ = <ARGV>); -e syntax OK
というわけで、forが違うというよりはファイルハンドルをリストコンテキストで読み込んだ場合とスカラーコンテキストで読み込んだ場合の動作が違う、っていうのが正解。
トラックバック(0)
このブログ記事に対するトラックバックURL: http://mt.endeworks.jp/cgi-bin/mt-tb.cgi/2450


コメントする