• ベストアンサー

IF文について

こんにちは。 フリーのチャットのperlで書かれたCGIを見ていて、以下のようなIF文が ありました。 これってどういう意味なのですか? if(! -f $log) { open(OUT,">$log"); close(OUT); } よろしくお願いします。

  • CGI
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

if(! -f $log) { ………………… もし $log (に格納されている名前の)ファイルが無かったら   open(OUT,">$log"); ……… その名前のファイルを開いて   close(OUT); ………………… 閉じる(つまり、空のファイルを作成する) } です。 # いや、私は perl をよく知らないので、「と、思います」だな

関連するQ&A

  • 極めて初歩的な質問ですみません

    PERLの勉強をつい最近はじめました。 参考にしている本のどこを探してもみつからなかったので、質問させていただきます。 sub lock{ $c = 0; while (-f $lockfile) { $c++; if( $c >= 5 ){ print 'BUSY 少し時間を置いてもう一度登録してください。',"\n"; exit; } sleep(1); } open(LOCK,">$lockfile"); close(LOCK); というサブルーチンがありまして、分からないのはwhile構文の条件の記述です。 (-f $lockfile) とは、-fとは、どういう意味なのでしょうか。 if(! -f $mail01 ){ open(OUT,">$mail01"); close(OUT); というところにもありました。 どうぞ教えてやってください。超初心者なので、どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • ログの一部を消す Perl

    ログの一部を消すPerlを考えています。 ここではソースを短くするために、ログの一部を消し去って ログファイルに上書きするデータは $deta だけだとすると open F, '+<a.log'; flock F,2; $deta = <F>;//実際はここでもっと処理 truncate F,0; seek F,0,0; print F $deta; close F; と、 open IN, 'a.log'; flock IN,2; open OUT, '>a.log'; flock OUT,2; $deta = <IN>;//実際はここでもっと処理 print OUT $deta; close OUT; close IN; の2つを考えました。 上のように 読み込み と 書き込み を同時にやった方がいいのか 下のように分けてやった方がいいのか教えてください。 ロックは flock を使って、普通レベルのロックが できるぐらいでいいと思っているんだけど、 この flock の書き方でおかしいところがあれば 教えてください。

    • ベストアンサー
    • CGI
  • if文がうまく書けない(T.T)

    某CGIを改造してます。 CGIにIDとPassを組み込もうとしているのですが、うまくできません。 いろいろな認証CGIを真似してやっているのですが… sub pass2{ open (FILE,"$passdata"); @file = <FILE>; close FILE; foreach (@file) { local($nm,$ps)= split(/,/,$_); if ($nm eq $in{'name'} && crypt($in{'password'},$ps) eq "$ps") { &admin; exit; } } &error("認証に失敗しました?"); } この状態だと動くことは動くのですが、ちょっと面倒なので逆転させたいんです。 そこで以下のように作り変えてみました。 if ($nm ne $in{'name'}) { &error("名前が違います"); exit; } if ($nm eq $in{'name'} && crypt($in{'password'},$ps) ne "$ps") { &error("パスワードが違います。"); exit; } } &admin } こうすると、なぜか正しい名前を入れても「名前が違います」のメッセージが出ます。 いったいどこが間違っているのですか? 言語はperlです。 お願いします。

    • ベストアンサー
    • CGI
  • flockについて

    http://www.freespace.jp/phpstudy.php4 のサイト様を拝見したり、フリーで配布されているスクリプトを見ると、書き込むファイルに対して、 $fp = fopen('bbs.log', 'r+'); flock($fp, LOCK_EX); … とやっていると思うのですが、perl記述のcgiで掲示板を作成したときは、書き込むファイルとは別にロック用のファイルを用意し、(perl記述です) open(LOCK,"+<$lockfile"); flock(LOCK,2); open(IN,"$logfile"); .... close(IN,"$logfile"); open(OUT,"$logfile"); .... close(OUT,">$logfile"); としていました。(書き込むファイルが2つあったのでこのような方法をとってました) そこでphpでも同じ方法は使えるのでしょうか? $fp = fopen('bbs.log', 'r+'); flock($fp, LOCK_EX); … の方法を使おうと思っていたのですが、最初にログファイルを読み込むとき、 file("bbs.log"); という風にしているので、flockに記述すべきファイルハンドルが見当たりません。仮に取得できたとしても、file();の仕様からして内部にcloseが入ってそうなので、flockできたとしてもcloseで無効になってしまわないかが心配です。なのでこの場合はやはり別にログファイルを用意しないとできないということでしょうか。

    • ベストアンサー
    • PHP
  • UTF-8に変換

    open( IN, "data.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">log.cgi" ); select OUT; foreach( @f_data ){ if( $i > 10 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1階 $f_data4\n"; $i++; } #書き出し先ファイルを閉じる select STDOUT; close( OUT ); 上記スクリプトでlog.cgiに書き出される文字コードをUTF-8に変換したいのですが、いろいろな解説サイトの説明通りに行うと、私のやり方が間違っているだけだと思いますが、サーバエラーになっていまいます。サーバはxrea.comを利用しております。 data.cgiの文字コードはSJISです。 上記スクリプトの場合は、どのように変更すればよろしいのでしょうか?宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • 指定行に書込み

    open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">dat.cgi" ); select OUT; print "document.open();\n"; print "document.write('"; foreach( @f_data ){ if( $i > 5 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1"; $i++; } print "');\n"; print "document.close();\n"; select STDOUT; close( OUT ); 上記スクリプトで、指定された行数、又は指定された場所でdat.cgiに 書き出したいのですが、どのように書けばよろしいのでしょうか? 例えば、 ・100行目に書き出す。 または、 ・指定された文字列の間に書き出す。 (例)<!--開始-->ここに書き出す。<!--終了--> このどちらかが出来ればいいのですが、上記スクリプトをどのように変更すれば可能になるでしょうか?お手数ですが、どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • 連続投票の制限

    投票cgiを設置したいのですがうまくいきません、集計を1日一回だったのを少し改造して即時集計にしました 一応動くのですが、連続投票できてしまいます。 連続投票を一定時間制限できるようにしたいのですがうまくいきません 60秒くらい間をおいてから投票できるようにできますか? ip制限もあるみたいなのですがこれも機能してないです・・・ 改善できるなら元のソースがかなり変わってもかまいません 連続投票制限だけでも機能できればと思っています。よろしくお願いします local $times = time(); sub vote{ if($FORM{id}){ my $fl=0; if(!$CK_ref){$fl=1;} else{ if(index($ENV{'HTTP_REFERER'},index.html>=0){$fl=1;} } if($fl){ $FORM{id}=~s/\n//g; my $vote = $FORM{vt2}?1:0; open(OUT,">>vote_temp.cgi"); #時間用のログファイルに書き込み print OUT "$FORM{id}<>$ENV{'REMOTE_ADDR'}<>$FORM{vt}<>$vote<>".$times."<>\n"; close(OUT); &reset_vote if $VT_RESET < $times; my(@log_lines,%pt,%pt2,%cnt,$name,$value,%CKIP); open(IN,"vote_temp.cgi"); my @log = <IN>; close(IN); if(@log){ my $cktime = $times - 60; #60秒制限 open(IN,"vote_ck_IP.cgi"); #投票した人のIPを記録したログ while(<IN>){ my @ck = split('<>'); next if $_[1] < $cktime; $CKIP{$_[0]} = $_[1]; } close(IN); foreach(@log){ chop; my @rank = split('<>'); #ID<>IP<>評価<>おすすめ<>時間\n next if $CKIP{"$rank[0]_$rank[1]"}; $pt{$rank[0].'_'.$rank[2]}++; $pt2{$rank[0]}++ if $rank[3]; $cnt{$rank[0]}++; $CKIP{"$rank[0]_$rank[1]"} = $rank[4]; } open(OUT,">vote_temp.cgi"); close(OUT); open(OUT,">vote_ck_IP.cgi"); while(($name, $value) = each(%CKIP)){ print OUT "$name<>$value<>\n"; } close(OUT); open(IN,"log.cgi"); my @data = <IN>; close(IN); foreach(@data){ #集計処理長かったので省略 } open(OUT,">vote_bf.cgi"); open(IN,"vote_log.cgi"); while(<IN>){ print OUT $_; } close(IN); close(OUT); open(OUT,">vote_log.cgi"); print OUT @log_lines; print OUT "\n1;\n"; close(OUT); } &make_vote_ck('set'); } } sub reset_vote{ my @log; foreach my $i(1..$LAST_ID){ next if !@{$VT[$i]}; $VT[$i][18] = $VT[$i][7]; $VT[$i][19] = $VT[$i][8]; $VT[$i][20] = $VT[$i][0]; foreach my $j(0..8){ $VT[$i][$j] = 0; } push(@log,'$VT['.$i.'] = ['.(join(',',@{$VT[$i]}))."];\n"); } open(OUT,">vote_log.cgi"); print OUT @log; print OUT "\n1;\n"; close(OUT); &make_vote_ck('reset'); } sub make_vote_ck{ if($_[0] eq 'set'){ my @t =localtime($times + 86400); $VT_TIME = timelocal(0,0,5,$t[3],$t[4],$t[5]); $VT_RANK = $VT_RUI = $VT_RECO = $VT_RCRUI = $VT_COUNT = $VT_CTRUI = $VRK_CK = 1; } if($_[0] eq 'reset'){ my @m =localtime($times); $m[4] += 1; if($m[4] > 12){ $m[4] = 1; $m[5] += 1; } $VT_RESET = timelocal(0,0,2,1,$m[4],$m[5]); $VT_RANK = $VT_RECO = $VRK_RS = $VRK_CK = 1; } if($_[0] eq 'restore'){ $VT_RANK = $VT_RUI = $VT_RCRUI = $VT_RECO = $VT_COUNT = $VT_CTRUI = $VRK_CK = 1; } open(OUT,">vote_ck.cgi"); print OUT "\$VT_TIME = '".$VT_TIME. "';\n"; print OUT "\$VT_RESET = '".$VT_RESET. "';\n"; print OUT "\$VT_RANK = '".$VT_RANK. "';\n"; print OUT "\$VT_RUI = '".$VT_RUI. "';\n"; print OUT "\$VT_RECO = '".$VT_RECO. "';\n"; print OUT "\$VT_RCRUI = '".$VT_RCRUI. "';\n"; print OUT "\$VT_COUNT = '".$VT_COUNT. "';\n"; print OUT "\$VT_CTRUI = '".$VT_CTRUI. "';\n"; print OUT "\$VRK_CK = '".$VRK_CK. "';\n"; print OUT "\$VRK_RS = '".$VRK_RS. "';\n"; print OUT "\$LAST_ID = '".$LAST_ID. "';\n"; print OUT "\n1;\n"; close(OUT); }

    • ベストアンサー
    • Perl
  • print文で「

    いつもお世話になっております。 早速ではありますが、 タイトル通り、print文で「""(ダブルクォーテーション)」を出力させたいです。 例えば、 open(OUT, ">>TEST.txt"); print OUT "123:456:789\n"; close(OUT); とある時、「456」だけに「""(ダブルクォーテーション)」をつけて「"456"」として出力・・・、 つまり、TEST.txt の最後の行に、 123:"456":789 と出力させるにはどうしたらよいでしょうか。 サーバー・・・HP-UX CGI開発言語・・・Perl5 開発端末・・・windows2000(Tera Term 使用) 以上、ご教授の程よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイルを読み込んで改行だけの行を取り除きたい

    こんばんは。 ファイルを読み込んで、改行だけの行を省いて、上書きしたいのですが なぜかうまくいきません。 ループ内にある改行の判定をするIF文がいけないと思うのですが…。 教えていただけないでしょうか? また、シングルクォーテーションダブルっクォーテーションは同じ意味 なのですか?「""」と「''」 作ったプログラムは以下です。 open(OUT,">$ssifile"); #改行のみのデータは除く @newtbl = (); foreach $siline ( @slines) { if ($slines ne "\n") { push @newtbl, $siline; } } print OUT @newtbl; close(OUT); 宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • IF文でページ振り分けがうまく出来てない。

    CGI勉強中です。 ある掲示板CGIを改造して会員のみに使用可にしようと考えています。パスワード自体は無事組み込むことが出来たのですが、1つ問題が出ました。 掲示板なので、過去ログがありますよね。その過去ログページを表示しようとするとまた認証ページに戻ってしまい、パスワードを再度入力→最新10件のページに戻ってしまいます。どうにかして、1度入ったらパスワードを入力しなくてもいいようにしたいのですが… 今のところこうなってます。 /////////////// if ($pass_mode == '1'){ ←もしパスを使用するだったら if ($F{'mode'} eq '') { &pass_mode} ←モード無しの場合、パス入力画面に移動 if ($F{'mode'} eq 'admin') { &admin} ←モードアドミニならsub adminへ } else{ if ($F{'mode'} eq '') { &main_form} ←メイン書き込みページへ else { &{$F{'mode'}} } } /////// となっています。 また、過去ページへの移動は「**.cgi?pg=10&sort=」という感じです。 この状態で、ページ移動時にパス入力ページに移動しないようにするにはどうしたらいいでしょうか?cookieを使う必要があったりしますか? 抜けてる情報・足りない情報があったら指摘してください。すぐ補足します。言語はperlで書いています。 よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう