D:\>perl -0777 -pe "print" test.html <html><head><title>PerlTest</title></head> <body> <h1>PerlTestBody</h1> <hr><p>AllAboutPerlOneLiner</p> </body> </html> <html><head><title>PerlTest</title></head> <body> <h1>PerlTestBody</h1> <hr><p>AllAboutPerlOneLiner</p> </body> </html> D:\>
例えばこんな感じ。こいつをPerlインタプリタは下のように解釈しているんだな。
while(<>){ print; } continue { print; }
出力を見るとよくわかるけど、whileループ中のprint文によって出力された変数内にはtest.htmlの内容全てが収められているんだな。だから、出力中の1番目の<html>から</html>まではwhileループ中のprint文で一気に出力され、2番目の<html>から</html>まではcontinue中のprint文で一気に出力されるんだな。これに対して、下のように書いた場合は結果が変わるんだな。
D:\>perl -pe "print" test.html <html><head><title>PerlTest</title></head> <html><head><title>PerlTest</title></head> <body> <body> <h1>PerlTestBody</h1> <h1>PerlTestBody</h1> <hr><p>AllAboutPerlOneLiner</p> <hr><p>AllAboutPerlOneLiner</p> </body> </body> </html> </html> D:\>
解釈は上の場合と全く同じなんだけど、whileループに渡されたダイアモンド演算子中の内容が異なっているんだな。
while(<>){ print; } continue { print; }
-0777をオプションで指定しない場合、ファイルから1行ずつ読み込んでその内容がダイアモンド演算子の内容になるから、ファイル中の内容を1行ごとwhileループ中のprint文で表示して、この後にもう一回continue中のprint文で同じ内容を表示しているんだな。試しに下のようにしてみると何回whileループ中の分を実行したかがよくわかるんだな。
D:\>perl -0777 -pe "$i++;print $i " test.html 1<html><head><title>PerlTest</title></head> <body> <h1>PerlTestBody</h1> <hr><p>AllAboutPerlOneLiner</p> </body> </html> D:\>
この場合は-0777オプションがついているので、test.html中の内容が一気に渡され、whileループは1回。
D:\>perl -pe "$i++;print $i " test.html 1<html><head><title>PerlTest</title></head> 2<body> 3<h1>PerlTestBody</h1> 4<hr><p>AllAboutPerlOneLiner</p> 5</body> 6</html> D:\>
この場合は-0777オプションがついていないので、test.html中の内容が行ごとに渡され、whileループは行数回だけ繰り返され、6回。
気分的な問題だけど、渡すファイルのファイルサイズが小さい場合は、-0777オプションをつけたほうが速いような気がしたんだな。つまり、
D:\>perl -0777 -pe "" test.html
としたほうが、
D:\>perl -pe "" test.html
とするよりも体感速度が速いということ。まぁタイプする量が少ないほうが好きなんで下のほうをよく使っちゃいますが。WindowsのMS-DOSプロンプトを使う場合は、入力する文字数に制限があるので、この手の逃げを使うことも結構有用かと。