• ベストアンサー

指定したファイルがあるかどうかの確認

指定したファイルがフォルダ内にあるかどうかを調べるために以下のようにしました。 #フォルダ内の確認 opendir (FOLDER,"img"); @FOLDERS = readdir (FOLDER); closedir(FOLDER); my ($cnt) = 0; foreach(@FOLDERS) { if ($_ =~ /.+\..+/) { $cnt++; } } #指定したファイルがあるかどうかの確認 for($i=1;$i<3;$i++){ for($n=2;$n<$cnt;$n++){ $F = $FOLDERS[$n]; if('$i.jpg' eq '$F'){ print "<TD CLASS=TD1><IMG SRC='img/$i.jpg' HEIGHT=65 WIDTH=50></TD>\n"; print "<FONT COLOR=RED>★</FONT><BR>\n"; #$i=$i+1; } elsif('$i.jpg' ne '$F'){ print "$i.jpg $F<BR>\n"; }#if } #for $n } #for $i ですがすべて「違う」となってしまいます。 どこがダメなのでしょうか? ※perlです。

  • CGI
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 文字列は '' (シングルクォート)ではなく、"" (ダブルクォート)でかこってみてください。  シングルクォートでは変数展開されないため、'$F' は、変数の中身ではなく、「$F という文字列」になってしまいます。

KODAMAR
質問者

お礼

回答ありがとうございます。 無事できました。 基本中の基本でしたね(^^;

その他の回答 (2)

  • HUTABA
  • ベストアンサー率27% (436/1611)
回答No.3

KODAMARさんこんにちは。 >if('$i.jpg' eq '$F'){ >} elsif('$i.jpg' ne '$F'){ この部分間違えていますよ。 >print "$i.jpg $F<BR>\n"; と大きく違う部分があるのがお分かりでしょうか? " と ' です。 if文の中では ' を使用しているのに、print()では " を使用しているから、何がおかしいのか解らなくなっているのでしょう。 >print "$i.jpg $F<BR>\n"; の部分を print '$i.jpg $F<BR>\n'; に変えてみるとよく解ると思います。 ' は、中にかかれたもの全てを文字と解釈します。 $i とか $F と書いても、それは「$i」「$F」という”文字列”があるのだと解釈され、決して「1.jpg」等には展開されません。 間違っている部分の動きを確認した上で、 ' を " に修正してください。

KODAMAR
質問者

お礼

回答ありがとうございます。 無事できました。 基本中の基本でしたね(^^;

KODAMAR
質問者

補足

みなさんにポイントを差し上げたいところなのですが、2人までですので先着順にポイントをつけさせていただきます。 ありがとうございました。

  • wolfwood
  • ベストアンサー率50% (199/398)
回答No.2

Perlの仕様でシングルクォーテーション(')で囲んだ文字列内では変数が評価されません。 つまり、変数の中身が展開されない為、 '$i.jpg'などはそのまま$i.jpgという文字列と認識されます。 ダブルクォーテーション(")で囲めば変数が展開されます。 http://village.infoweb.ne.jp/~fwnw6734/perl/perl1-2.html http://www.hahaha.jp/check/perl_02.htm

KODAMAR
質問者

お礼

回答ありがとうございます。 無事できました。 基本中の基本でしたね(^^;

関連するQ&A

  • 指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすいい方法(CGI)

    指定のフォルダに指定のファイルがあったら画像を表示、なければ飛ばすというようにしたいのです。 opendir (FOLDER,"img"); @FOLDERS = readdir (FOLDER); closedir(FOLDER); my ($cnt) = 0; foreach(@FOLDERS) { if ($_ =~ /.+\..+/) { $cnt++; } } $tate = $cnt/10; print "<TABLE CELLSPACING=0 CELLPADDING=2>\n"; print "<TR>\n"; for($i=1;$i<11;){ for($n=2;$n<$cnt;$n++){ $F = $FOLDERS[$n]; if("$i.jpg" eq "$F"){ print "<TD CLASS=TD1><IMG SRC='img/$i.jpg' HEIGHT=65 WIDTH=50><BR>$i</TD>\n"; $i=$i+1; } #if } #for $n } #for $i というようにしてみたのですが時間がかかりすぎてしまいます。 何かいい方法はないでしょうか?

    • 締切済み
    • CGI
  • CGI コメント欄の文章を行替えしたいのです

    お世話になります。 野球スコアボードのCGIなのですが、コメント欄の文章がどうしても1列になってしまい、行替えができません。 文章で<br>を書き加えると、1行分のみしか表示されず、改行の2行目以降が表示されません。   以下の構成でどのようにすれば、文章の行替えが可能になりますか? アドバイスよろしくお願い致します。 <tr><td colspan=\"2\"> <font color=white>スコアボード<center> <table border=\"1\" bgcolor=\"#009933\" cellspacing=0 bordercolor=\"black\"> "; for($i=0;$i<@score;$i++){ print "<tr>"; @team_score=split(/,/,$score[$i]); if($i eq 0){ print "<tr>"; for($s=0;$s<@team_score;$s++){ if($s eq 0){ print "<td width=80> <font color=\"white\"> <center><i>チーム名 </td>"; }else{ print "<td width=\"20\"> <font color=\"white\"> <center><i>$s </td>"; } } print "<td width=40><font color=\"white\"><center><i>合計</td>"; print "</tr><tr>"; } $point=0; for($j=0;$j<@team_score;$j++){ print "<td><font color=\"white\">"; print"<center>"; if($team eq $team_score[$j]){ print "<b>" } print"$team_score[$j]</td>"; if($j eq 0){ }else{ $point=$point+$team_score[$j]; } } if($cnt[$i-1] eq $j || $i eq 0){ print "<td><font color=\"white\"><center>$point</td>"; }else{ print "<td> <font color=\"white\"><center>× </td> <td> <font color=\"white\"><center>$point </td>"; } print "</tr>"; $cnt[$i]=$j; } print "</table><p></td></tr>"; print "<tr><td bgcolor=\"#778899\" height=100> <font color=white>コメント </td> <td bgcolor=\"#f8f8ff\"> $cmt[$p] </td></tr>"; print "</table>"; print "<p><hr width=500><p>"; } } print " </body></html>"; exit;

    • ベストアンサー
    • CGI
  • カレンダ-の表示

    下記はカレンダ-を表示するプロガラムです、 画面の一番上から表示したいのですが何行か下に表示されます、 一番上から表示するのは、どうしたら良いですか、 よろしくお願いします。 #!/usr/local/bin/perl print "Content-type: text/html\n"; print "\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>カレンダ-</TITLE>\n"; print "</HEAD>\n"; ########################################## @youbi = ('日', '月', '火', '水', '木', '金', '土'); print "<BODY BGCOLOR=\"WHITE\">\n"; print "<CENTER>\n"; print "<TABLE BORDER=\"0\" cellpadding=\"1\" cellspacing=\"2\"><TBODY><TR VALIGN=\"top\" BGCOLOR=\"BLUE\"><TD>\n"; $tuki = 0; for ($k = 1; $k <= 12; $k++) { print "<TABLE BORDER=\"0\" BGCOLOR=\"BLUE\" cellpadding=\"2\" cellspacing=\"1\" width=25%><TBODY>\n"; print "<TR ALIGN=\"middle\"><TD colspan=\"7\"><FONT SIZE=\"2\" COLOR=\"WHITE\">$year年 $ntuki月</FONT></TD></TR>\n"; print "<TR>\n"; for ($i = 0; $i < 7; $i++) { print "<TH BGCOLOR=\"SKYBLUE\"><FONT SIZE=\"2\" COLOR=\"BLACK\">$youbi[$i]</FONT></TH>\n"; } if (($k == 4) || ($k == 8)){ print "</TBODY></TABLE></TD></TR><BR CLEAR=\"all\"><BR><TR VALIGN=\"top\" BGCOLOR=\"BLUE\"><TD>\n";} elsif ($k == 12) { print "</TBODY></TABLE></TD></TR></TBODY></TABLE><BR CLEAR=\"all\"><BR>\n";} else { print "</TBODY></TABLE></TD><TD>\n";} $kuuhaku = 0; $hiduke = 0; } print "</CENTER>\n"; print "</BODY>\n"; print "</HTML>\n";

    • ベストアンサー
    • CGI
  • ループしてしまいます

    $colの結果は5件です。 次のfor文を流すと、cnt=1の場合の $SyaNo . $cnt = $col2['SyaName']; が print $SyaNo . $cnt によって表示されますが、 cnt=1のみの結果がループします。 cnt=2、cnt=3、cnt=4の結果はどうしたら表示されるでしょうか? どうしてループしてしまうのでしょうか? --------- while($col = mysql_fetch_array($result1)){ for($cnt=1; $cnt<=4; $cnt++){ print $cnt . " "; print $col[SyaNo.$cnt] . " "; if ($col[SyaNo.$cnt] != ""){ $sql = "select SyaName from Syain where SyaNo = " . $col[SyaNo.$cnt]; $result2 = mysql_query($sql,$link); $col2 = mysql_fetch_array($result2); $SyaNo . $cnt = $col2['SyaName']; print $SyaNo . $cnt; } } ------------- $body .= "<td>" . $SyaNo1 . "</td>\n"; $body .= "<td>" . $SyaNo2 . "</td>\n"; $body .= "<td>" . $SyaNo3 . "</td>\n"; $body .= "<td>" . $SyaNo4 . "</td>\n";

    • ベストアンサー
    • PHP
  • 画像のロールオーバー

    画像のロールオーバーで下記のスクリプトを教えてもらいました。 画像aをマウスオーバーで画像a2に変わる クリックでオーバーした状態を保持(画像a2のまま) さらに、画像bをマウスオーバーで画像b2に変わり クリックでオーバーした状態を保持(画像b2のまま) そのクリック時、画像a2が画像aに変わる 実装できたのですが。 下記のソース2つテーブルが1つのhtml上にあり a~fまでg~iまで画像が分かれていて a~fをクリックし画像が変わった後 g~iをクリックするとa~fの画像が変わらないようにしたいのです。 二つのテーブルの画像を別々に考えたいのですが、できますでしょうか? よろしくお願いします。 <html> <head> <style type="text/css"> <!-- img.group {width: 111px; height:50px;} --> </style> <script type="text/javascript"><!-- var img=['a.jpg,a2.jpg','b.jpg,b2.jpg','c.jpg,c2.jpg','d.jpg,d2.jpg','e.jpg,e2.jpg','f.jpg,f2.jpg','g.jpg,g2.jpg','h.jpg,h2.jpg','i.jpg,i2.jpg']; var elm=[]; var o_idx=-1; window.onload=function(){ var e=document.getElementsByTagName('IMG'); for (var i=0,j=0; i<e.length; i++) if (e[i].className=='group1') elm[j++]=e[i]; for (i=0; i<elm.length; i++){ elm[i].onmouseover=change(i,1); elm[i].onmouseout=change(i,0); elm[i].onclick=change(i,2); } } function change(idx,n){ return function(){ if (n > 1){ if (o_idx > -1) elm[o_idx].src=img[o_idx].split(',')[0]; elm[idx].src=img[idx].split(',')[1]; o_idx=idx; } else { if (idx != o_idx) elm[idx].src=img[idx].split(',')[n]; } };} // --></script> </head> <body> <table width="676" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="111"><img src="a.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="b.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="c.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="d.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="e.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="f.jpg" width="111" height="50" border="0" class="group1"></td> </tr> </table> <br> <table width="333" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="111"><img src="g.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="h.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="i.jpg" width="111" height="50" border="0" class="group1"></td> </tr> </table> </body> </html>

  • フォームメール確認用ページ

    フォームメールの確認用のページで、 cgiから書き出す、最終的な確認部分を、入力フォームから内容を受けた部分のみ表示しようとおもうのですが、以下の書式だとhtml内のsub部分の指示が効かずに、画面にそのままsub~と書き出されてしまいます。 どなたか良い方法を教えていただけないでしょうか? よろしくお願いいたします。 省略 $errNum = chkFormInput(); fixTags(); &okhtml(); sub okhtml{ print "Content-type:text/html\n\n"; print <<DATA; <html> <head> 省略 sub hoge { if ($hoge eq "") { print "<tr><td height="1" width="1"><img src="bitr.gif" width="1" height="1"></td></tr>\n"; }else{ print "<tr><td align=center width="30" bgcolor="#ffffdd"><font color="#333300" class="text2">8.</font></td> <td width="3"><img src="bitr.gif" width="1" height="1"></td> <td width="106" height="27" bgcolor="#ffffaa"><img src="bitr.gif" width="1" height="1"><font color="#333300" class="text2">連絡先<font class="text2" color="#cc0000"></td> <td width="3"><img src="bitr.gif" width="1" height="1"></td> <td width="414" bgcolor="#ffffdd"><img src="bitr.gif" width="1" height="1"><font class="text5">$hoge</font></td></tr> <tr><td colspan="5" height="2"><img src="bitr.gif" width="1" height="1"></td></tr>\n"; } }

    • ベストアンサー
    • Perl
  • ログファイル表示で全部表示されたりされなかったり…

    ログファイルをオープン、その中のユーザー名・パスワードと入力されたユーザー名・パスワードを比較して、どちらも一致した場合のみ表示するようなものを作成しました。 ただ単に表示を行うと一致するものすべて表示されるのですが、テーブルなどを使用して表示させると数が減って表示されるのです。 これはいったいなぜでしょうか? ---------- for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach if($FORM{'USER'} eq $FORMS{'USER'}){ if($FORM{'PASSWORD'} eq $FORMS{'PASSWORD'}){ print "$FORMS{'TITLE'}<BR>\n"; print "<BR>\n"; だと全件(19件入力中、一致は18件。18件すべて)表示 一番下を print "<TABLE>\n"; print "<TR><TD>$FORMS{'TITLE'}</TD></TR>\n"; print "</TABLE><BR>\n"; print "<BR>\n"; と変更すると13件しか表示されません。

    • ベストアンサー
    • CGI
  • フォルダ内の画像にリンクを指定するには?

    html本文には画像パスを指定せずに、スクリプト(画像を連番で読み込む)にて指定しています。 その場合、連番の最初の「001.jpg」にはリンクを指定出来るのですが、以降の「002.jpg」~は指定が出来ません。 これを解決するためにはどうしたらいいでしょうか? あらかじめ、連番すべてにリンクを指定したものを読み込ませるとか・・・? (いくつかを考えてみたのですが、解決に至っておりません) 以下、ご確認お願い致します。 (一部抜粋しております) <script language="JavaScript"> <!-- // 以下スクリプト設定部分 FITime=0; // n=100; // Lnum=4; // cnt=0; // Fna="test"; // Fexp="jpg"; // // 以下スクリプト本体 function fade(){ n=n+2; if(n>=100) clearInterval(TM) else{ test.filters(0).opacity=n;} } function ChangeNext(){ n=0; cnt++;if(cnt>Lnum){cnt=0;} document.test.src=Fna+cnt+"."+Fexp; TM=setInterval("fade()",FITime) } function ChangeBack(){ n=0; cnt--;if(cnt<0){cnt=Lnum;} document.test.src=Fna+cnt+"."+Fexp; TM=setInterval("fade()",FITime) } //--> </script> </head> <body> <img src="test001.jpg" name="test" border="0" />

  • 「戻る」「進む」ボタンで画像を変えるには?

    「戻る」「進む」ボタンで5枚の画像を変えられるようにしたいのですが、なかなかできません。 順番が飛んでしまったりしてしまいます。 var n=0; var imgDB=new Array("kenkyu/0.jpg","kenkyu/1.jpg","kenkyu/2.jpg","kenkyu/3.jpg","kenkyu/4.jpg"); function change(){ if(n==0)n=4; if(n==5)n=0; document.img.src=imgDB[n]; } <TABLE cellpadding="10" bgcolor="#0099cc"> <TBODY> <TR> <TD><IMG src="kenkyu/0.jpg" name="img" width="500" height="400" border="0"></TD> </TR> </TBODY> </TABLE> <A href=JavaScript:n--;change();><IMG src="kenkyu/modoru.jpg" width="96" height="28" border="0"></A>  <A href=JavaScript:n++;change();><IMG src="kenkyu/susumu.jpg" width="96" height="28" border="0"></A><BR> 分かる方、教えて下さい。 よろしくお願い致します。

  • javascriptのカルーセル

    配列に入れたイラストとそのタイトルを「次へ」「戻る」ボタンで順次両方向に表示したいのです。画像をボタンで前後に移動するところまではできたのですが、画像に対応する表題をどうやって表示したらいいのかどなたか教えていただけないでしょうか。やはりテーブルを利用しないとだめでしょうか。そうすると今度は画像をどうやって配列からテーブルに呼び出していいかわかりません。表題ですので画像と表題を配列に入れて同じカウンタで呼び出せればと思っています。以下現在のコードです。よろしくお願いします。 <html> <head> <title>バックナンバー</title> </head> <body> <center> <table width="550"><tr><td><td> <script type="text/javascript"> <!-- //画像を格納する配列の作成 var IMG = new Array(); IMG[0]=new Image(); IMG[0].src="chatsune/chatsune18.JPG"; IMG[1]=new Image(); IMG[1].src="chatsune/chatsune19.JPG"; IMG[2]=new Image(); IMG[2].src="chatsune/chatsune20.JPG"; IMG[3]=new Image(); IMG[3].src="chatsune/chatsune21.JPG"; IMG[4]=new Image(); IMG[4].src="chatsune/chatsune22.JPG"; IMG[5]=new Image(); IMG[5].src="chatsune/chatsune23.JPG"; IMG[6]=new Image(); IMG[6].src="chatsune/chatsune24.JPG"; IMG[7]=new Image(); IMG[7].src="chatsune/chatsune25.JPG"; var cnt=0; function Forward() { if(document.getElementById) { if(cnt >= IMG.length-1) { cnt = IMG.length-1; } else{ cnt++; document.getElementById("sd").src = IMG[cnt].src; //一つ画像を表示したらカウント用変数cntの値を+1にする } } } function Back() { if(document.getElementById) { if(cnt <= 0) { cnt = 0; } else { cnt--; document.getElementById("sd").src = IMG[cnt].src; } } } </script> <img src="chatsune/chatsune18.JPG" id="sd" width="500" height="480" alt=""> <br> </td></td></tr> <tr><td align="left"> <form name="slide"> <input type="button" value="戻る" onclick="Back()"></td> <td align="right"> <input type="button" value="次へ" onclick="Forward()"></td></tr> <tr><td></td><td align="right"> <a href="list.html">バックナンバーのリストへ戻る</a></td></tr> </table> </form> </body> </center> </html>

専門家に質問してみよう