プロが教える店舗&オフィスのセキュリティ対策術

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;

A 回答 (1件)

STDIN に限らず, ファイルハンドルに対する <> 演算子は (スカラーコンテキストでは) 「1行読み込む」という動作をします. 次に <> で読み込むことを考えると, 当然「次の行に進む」ことになっていないとおかしいですよね.


諦めて配列に保存してください.
    • good
    • 0
この回答へのお礼

ありがとうございます。

<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);

お礼日時:2009/07/28 14:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!