最終行と比較してエラー表示をさせるには?

[上に] [前に] [次に]
がんま 1998/09/10(木) 02:14:54
何度も質問をして、すみません。

open(IN, './fzr.dat');
while (<IN>) {
chop;
push(@datas,$_);
splice(@datas,99);
}
close(IN);

push(@datas,"$min,");

open(OUT, '>./fzr.dat');
foreach ( sort @datas ) { print OUT "$_\n"; }
close(OUT);

このプログラムに追加するものと考えているのですが

やりたいことは
「fzr.dat」に1行から100行までのデータが入っていた場合で
例えば1から始まって、100までの数字が入っているとします。

そこへ101のデータが入ってくる場合に
当然100行までの表示しか許さないので、登録不可のエラーメッセージを
出したいと考えています。

ようするに、最終行の数値と比較して、100行内に入らないならエラーと
したいのです。

自分なりの解釈などで、試したのですが
fzr.datに登録したデータがそっくり消えてしまったりと、どうもうまく組めません。

上記のプログラムを実行すると
101と入力したものが100のところに入り

 99
101

と、このように最終行の数値を入れ替えてしまうのです。

聞いてばかりで、失礼かと思いますが
よろしくお願いします。

B-Cus 1998/09/10(木) 02:23:33
> ようするに、最終行の数値と比較して、100行内に入らないならエラーと
> したいのです。

この方針とプログラムの書き方が全く違うのでよくわからんのですが、
# どこを見てもエラーで弾こうとしていない。

$#で配列の個数を調べて、それが既に100ならエラーではじくのは
どうですか。

 @foo=(0,1);
 print $#foo;

だと 1 が表示されます。

B-Cus 1998/09/10(木) 02:38:50
> それが既に100なら

失礼、99ですね。で、

open(IN, './fzr.dat');
while (<IN>) {
 chop;
 push(@datas,$_);
}
close(IN);

if ( $#datas >= 99 ){
 既に100個以上登録済。exit;
}

push(@datas,"$min");

みたいな感じでいかがかと。

…なんか、読んでるうちに、
 「ソートした結果、追加したものが100番以内に入らなかったらエラー」
というのが目的なのかなと思えてきたんですが、だったら

if ( $min > $datas[$#datas] ){
 エラー。
}

ですかね。比較に > と >= のどちらを使うかは目的による、
ということで。

がんま 1998/09/10(木) 15:20:07
>…なんか、読んでるうちに、
> 「ソートした結果、追加したものが100番以内に入らなかったらエラー」
>というのが目的なのかなと思えてきたんですが、だったら

 すみません! 説明不十分でご迷惑をお掛けしました。

>if ( $min > $datas[$#datas] ){
> エラー。
>}

 この文を使ったら出来るようになりました。

 今試しに、教えて頂いた分を使って「$min」「$sec」「$msec」の3つの変数を
 使って組んでいるのですが、どういうわけか、思ったような反応をしてくれません。

 fzr.datの最終である100行目に「2,05.999」が入っていたとして
 フォームの入力値は「2,05,009」として、送信ボタンを押すと

 「$min」でエラーが発生するという状態になってしまいます。

if ($min > @datas[$#datas]) {
$text = "エラー\n";
&error_html;
} elsif ($sec > @datas[$#datas]) {
$text = "エラー2\n";
&error_html;
} elsif ($msec > @datas[$#datas]) {
$text = "エラー3\n";
&error_html;
}

と、このようにして見たのですが、上記の通り、エラーが出てしまい
結果が得られません。

これはデータの保存方法そのものを変えないと駄目なのでしょうか?
その場合のテストをしようとリファレンスをみて「substr」が
使えるかと思ったのですが、正確な表記の仕方が分からず・・・。

なんとなくで(これが駄目なんですよね)やってみたのですが
何も表示されませんでした。

ちょっと説明が足りないかも知れませんが
よろしくお願いします。

がんま 1998/09/10(木) 15:22:58
if ($min > @datas[$#datas]) {は
元のif ($min > $datas[$#datas]) {でも
エラー表示されてしまいます。

B-Cus 1998/09/10(木) 21:11:20
> fzr.datの最終である100行目に「2,05.999」が入っていたとして
> フォームの入力値は「2,05,009」として、送信ボタンを押すと

としたときに、「$min」「$sec」「$msec」はそれぞれどういうふうに
設定されるのですか? $min=2、$sec=5、$msec=999?

また、「2,05.999」は「.」を使ってますが、「2,05,009」は
「,」のみですが、これは正しい使い方ですか?

これはperlうんぬんではなく、作成者のがんまさんしか知らないこと
なので、そういうことはできるだけ詳しく説明するようにしてください。

> if ($min > @datas[$#datas]) {は
> 元のif ($min > $datas[$#datas]) {でも

CGIで実行するとわからないと思いますが、コマンドラインから
 #!/usr/local/bin/perl -w
と、-wオプションを付けて実行すると、
 Scalar value @datas[$#datas] better written as $datas[$#datas]
というwarningが出ると思います。
 「スカラー値なんだから、@datas[$#datas]じゃなくて$datas[$#datas]と
  書いた方がいいんでない?」
という意味ですね。

とほほ 1998/09/10(木) 23:33:31
うーん、すみません・・・質問の内容がQ&Aではなく、個人指導の場
になっている感じがしてきたので、すみませんが、この手の質問は、私
個人宛て(B-CasさんがOKすればB-Casさんも?)のメールでお願いいたし
ます。

第三者が「ラウンジ」を見た時の情報密度を高めたいのと、ディスク消
費量をおさえたいのがねらいです。すみません。よろしくお願いいたし
ます。

がんま 1998/09/10(木) 23:55:34
確かに、そうですね。
趣旨に反した行動をしてしまったようで、すみませんでした。

それでは、メールを送りますので
よろしくお願いします。

B-Cus 1998/09/11(金) 01:24:10
失礼しました>とほほさん

えっと、僕はfj.comp.lang.perlや http://www.sega.co.jp/sega/p_cafe/bbs.html
などのBBSに投稿していただければ、この続きをさせていただきます。

あと、アルゴリズムについての一般的な質問は、質問する前に
2、3日一人で悩んでみる、というのも手です>がんまさん。
それで解決することも多いですよ。

がんま 1998/09/11(金) 10:22:01
ご迷惑をお掛けしてすみません、B-Cusさん。

>あと、アルゴリズムについての一般的な質問は、質問する前に
>2、3日一人で悩んでみる、というのも手です>がんまさん。

そうですね。 確かに何でもかんでも聞いていたら
自分の為にもならないですからね。

今後、そのようにして行きます。

[上に] [前に] [次に]