※ ChatGPTを利用し、要約された質問です(原文:STDINの挙動がよく分かりません)
STDINの挙動がよく分かりません
POST形式で読み込んだデータを3通りで書きだしてみました。しかしながら1番最初のファイルにしかデータは書き出されていません。
ひょっとしてSTDINはコンピュータがアクセスしてきた時の行を覚えていて、次のアクセスがあった時はそこから処理が行われるのでしょうか。それなら1度ファイルに全ての入力データを書き出した際にアクセスポイントはファイルの最後になっているから、2度目、3度目の書き出しの際はループが廻るはずがありません。
そこで書き出しまえに$-を書き出してみました。でも1度目のループを行う前から値は0。
前にファイルハンドル名など何かを付けなくては$-は死んでいるのかと思って、$=を書き出してみると60という値を取ります。でも書き出された1度目のループのファイルを数えてみると$=80なんです。何なんでしょう、この60という値は。
どうもSTDINの挙動が分からないのですが、どういう理由でこうなっているのか。どうしたら3回ループを廻すことが出来るのかご教授いただけないでしょうか。
**********************************************
#!/usr/bin/perl -d
use CGI;
use SR;
open(OUT,'>stdin_main.txt');
print OUT $-."\n";
print OUT $=."\n";
while(<STDIN>) {
print OUT $_;
}
close(OUT);
&SR::parse_form;
our $q=new CGI;
print $q->header(-charset=>'utf-8'),
$q->start_html(-charset=>'utf-8',
-lang=>'ja-JP'),
$-,"<br />\n",
$=,"<br />\n";
while(<STDIN>) {
print $_;
}
print $q->end_html;
**********************************************
package SR;
sub parse_form {
open(OUT,'>stdin_SR.txt');
print OUT $-."\n";
print OUT $=."\n";
while(<STDIN>) {
print OUT $_;
}
close(OUT);
}
1;
お礼
ありがとうございます。 <STDIN>は配列にいれるようにします。 調べてみたところ、$=は「write関数でフォーマット出力時の現在のページ行数」で、ループが幾ら廻っても、データの行数が何行であっても、フォーマットが60行とあれば、$=の値は60です。 $-は「write関数でフォーマット出力時の現在のページの残行数」で、printでは値が動きませんがwriteしてみると動きました。 ありがとうございます。 **************************** #!/usr/bin/perl my ($all,$rest); format = rest: @<< $rest . open(IN,'stdin_main.txt'); while(<IN>) { $rest=$-; write; } close(IN); open(IN2,'stdin_main.txt'); while(<IN2>) { print $-."\n"; } close(IN2);