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

ログファイルから任意の行を取り出すために、フォームで行を指定(入力)後、送信ボタンを押すと
表示させるようにしました。
if文はこんな感じです。

if ($NO == ''){
print &all;
}
else{
print &no;
}

1より大きい時と、何も入力しないときはきちんと希望したものが表示されるのですが、
問題は0を入れたとき(ログファイルの1行目を出したい時)に、何も入力されてないと
認識されてしまうのです。

どうしたらよいでしょうか?

※$NOの後の==をeqに変えると何も入っていなくても0と認識されてしまいます。

A 回答 (4件)

&noのサブルーチンがどうなっているのか分かりませんので、普通に全部書き出す時と1行書き出す時の


スクリプトを書いておきます。

##ログファイルを開く
open(IN,"開くファイル名")
@lines = <IN>;
close(IN);

##ナンバーが記入されてなければ全部(下の例は1行ごとに改行)、されていれば その行だけを書き出し
if($NO eq ""){
foreach $line (@lines){
print $line."<BR>";
}
}else{
print $lines[$NO];
}
    • good
    • 0

ぐはっ


おおぼけをかましていまいました。全面的に訂正します。
実は、FORMで入力した値を parseする部分を間違えてました。

if ($NO eq '') {
で正常に動作しているようですよ。

(補足依頼)

FORMで入力した値の取得はどうやってます?
Sub no($NO) はどうなってます?
    • good
    • 0

ちょっと姑息だけど、簡単な手段。



if ($NO eq '') {
  $NO = -1;
}
if ($NO < 0){
  print &all;
} else {
  print &no;
}

でも、普通は 0 や「リターン」が入力された時は特別な処理というのが一般的なプログラミングじゃないですかね。

この例でいえば全てが対象とか、処理終了とか。
「リターン」のみはケースバイケースではねることも。
    • good
    • 0

== は数値比較用の演算子なので、比較対照が文字列の場合は数値化して比較します。

(数値への変換方法は、Cの atof と同じです。)
したがって '' は数値の 0 と認識されるので、$NO が 0 の時は「等しい」と判断されるのです。

で、普通は $NO eq '' として、“何も入っていない場合は” という条件にするのですが、
> ※$NOの後の==をeqに変えると何も入っていなくても0と認識されてしまいます。
ということは、何も入っていないはずの $NO に、何らかの値が入っていることが考えられます。
実際、
  $NO = '';
  if ($NO eq '') { print "Empty\n" }
というスクリプトでは Empty と表示されますから、if文の直前で次のようにして $NO の値を確認してみる必要があります。
  printf "\$NO="$NO", length=%d\n", length($NO);
    • good
    • 0

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