if文中で配列変数って使用できるのでしょうか?
やりたいことは、
フォームを使って入力されたデータと、ログファイルの中身を1行ずつ比べて、
同じものがあったら、そこで比較を終了させる、というようなことをやりたいのです。
たとえでこんな感じでif文つくりました。(これもあってるかどうか微妙なのですが。)
for($i=0; $i<5){
@FILELOG2 = split(/&/,$FILELOG[$i]);
if (@FILELOG2 eq @log){
print "ok\n";
}else{
print "ng\n";
}
exit;
}
フォームを使って入力されたデータは、
read(STDIN,$buffer,$ENV{'content_length'});
$buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@log =split(/&/,$buffer);
のような感じで処理してあります。
ログファイルは
#ログファイルをオープン。
open FILE,"<02.log";
flock(FILE,2);
@FILELOG=<FILE>;
flock(FILE,8);
close FILE;
のようにしてあります。
おわかりの方、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
#1です。
>FILELOG2の前の#は何を意味するものなのでしょうか?
$#FILELOG2は、@FILELOG2の最後の添え字を返します。
例えば@FILELOG2の要素数が3だった場合は、2を返します。
>合っているところまでそれぞれの値を表示し、止まるのですが、
>「あってるよ」が表示されません。
>なぜでしょうか?
横レスで申し訳ありませんが、ログファイルの方には改行が含まれていませんか?
例えば $SYOZOKU1 が "所属" $SYOZOKU2 が "所属\n"の場合、表示すると一見同じに見えますが改行が入っているので
if ($SYOZOKU1 eq $SYOZOKU2)
はヒットしません。
$SYOZOKU2の改行をあらかじめ取っておくなりすれば良いと思いますよ。
回答ありがとうございます。
>$#FILELOG2は、@FILELOG2の最後の添え字を返します。
ありがとうございます、理解できました。
>$SYOZOKU2の改行をあらかじめ取っておくなりすれば良いと思いますよ。
@FILELOG2 = split(/&/,$FILELOG[$i]);
@FILELOG2 = ~ s/\n//g;
のようにしてみましたが、やはりダメでした。
改行をとるというのはこういうことではないのでしょうか?
よろしくお願いします。
No.4
- 回答日時:
#1、#3です。
@FILELOG2 = ~ s/\n//g;
ではなくて、
for文の中で
$FILELOG[$i] =~ s/\n$//;
@FILELOG2 = split(/&/,$FILELOG[$i]);
として下さい。
\n$ の "$" は正規表現で文末を意味します。
この場合、文末の\nだけを削除します。
この回答への補足
また教えていただきたいのですが、
print "Content-type:text/html\n\n";
$flag = 0;
for($i=0;$i<$#FILELOG && $flag==0;$i++){
$FILELOG[$i] =~ s/\n$//;
@FILELOG2 = split(/&/,$FILELOG[$i]);
($BANGOU2,$NAME2,$SYOZOKU2) = split(/&/,$FILELOG[$i]);
($BANGOU2TITLE,$BANGOU2) = split(/=/,$BANGOU2);
($NAME2TITLE,$NAME2) = split(/=/,$NAME2);
($SYOZOKU2TITLE,$SYOZOKU2) = split(/=/,$SYOZOKU2);
print "$flag$flag<BR>\n";
print "$i$i<BR>\n";
print "BANGOU1は「$BANGOU1」<BR>\n";
print "NAME2は「$NAME1」<BR>\n";
print "SYOZOKU1は「$SYOZOKU1」<BR>\n";
print "<BR>\n";
print "BANGOU2は「$BANGOU2」<BR>\n";
print "NAME2は「$NAME2」<BR>\n";
print "SYOZOKU2は「$SYOZOKU2」<BR>\n";
print "<BR><HR>\n";
if($BANGOU1 eq $BANGOU2 && $NAME1 eq $NAME2 && $SYOZOKU1 eq $SYOZOKU2){
print "あってるよ\n";
}
#終わらせたい時は $flag を 1 にする
}
としていますが、ログファイルの2行目まで(iが1まで)しか動作しません。
なぜでしょうか?
回答ありがとうございます。
文末には「$」を使うんですね。
知りませんでした。
無事「あってるよ」が出力されました。
ありがとうございました。
No.2
- 回答日時:
> if (@FILELOG2 eq @log){
↑これだと、両方の配列の数が同じだったらtrueが返ります。
if文で配列丸ごとゴッソリ
「中身がまったく同じだったら」という一発比較は、
どの言語であっても出来ないと思いますよ。
($a,$b,$c) = split(/&/,$FILELOG[$i]);
と、変数に格納してから
if($a eq $log[0] && $b eq $log[1] && $c eq $log[2]){
print "OK";
}
とした方がいいです。
> そこで比較を終了させる
をやりたい場合は、
$flag = 0;
for($i=0;$i<$#FILELOG && $flag==0;$i++){
#終わらせたい時は $flag を 1 にする
}
として、$flagが0の間だけfor回しを行う、
という風にしたらいいのではないでしょうか。
回答ありがとうございます。
ご指摘とおり、こんな感じにしてみました。
#フォームで送られてきたデータを分割 ($BANGOU1・$NAME1・$SYOZOKU1)
($BANGOU1,$NAME1,$SYOZOKU1) =split(/&/,$buffer);
($NAKAMITITLE,$BANGOU1TITLE,$BANGOU1) = split(/=/,$BANGOU1);
($NAME1TITLE,$NAME1) = split(/=/,$NAME1);
($SYOZOKU1TITLE,$SYOZOKU1) = split(/=/,$SYOZOKU1);
#ログファイルを分割 ($BANGOU2・$NAME2・$SYOZOKU2)
($BANGOU2,$NAME2,$SYOZOKU2) = split(/&/,$FILELOG[$i]);
($BANGOU2TITLE,$BANGOU2) = split(/=/,$BANGOU2);
($NAME2TITLE,$NAME2) = split(/=/,$NAME2);
($SYOZOKU2TITLE,$SYOZOKU2) = split(/=/,$SYOZOKU2);
それをfor文でループさせる。
print "Content-type:text/html\n\n";
$flag = 0;
for($i=0;$i<$#FILELOG && $flag==0;$i++){
@FILELOG2 = split(/&/,$FILELOG[$i]);
($BANGOU2,$NAME2,$SYOZOKU2) = split(/&/,$FILELOG[$i]);
($BANGOU2TITLE,$BANGOU2) = split(/=/,$BANGOU2);
($NAME2TITLE,$NAME2) = split(/=/,$NAME2);
($SYOZOKU2TITLE,$SYOZOKU2) = split(/=/,$SYOZOKU2);
print "$BANGOU1<BR>\n";
print "$NAME1<BR>\n";
print "$SYOZOKU1<BR>\n";
print "<BR>\n";
print "$BANGOU2<BR>\n";
print "$NAME2<BR>\n";
print "$SYOZOKU2<BR>\n";
if($BANGOU1 eq $BANGOU2 && $NAME1 eq $NAME2 && $SYOZOKU1 eq $SYOZOKU2){
print "あってるよ\n";
}
#終わらせたい時は $flag を 1 にする
}
としてみました。
合っているところまでそれぞれの値を表示し、止まるのですが、
「あってるよ」が表示されません。
なぜでしょうか?
よろしくお願いします。
No.1
- 回答日時:
>if (@FILELOG2 eq @log)
このif文だと、KODAMARさんの期待通りの動作はしません。
この場合、@FILELOG2と@logの要素数を比較し、同じ数であればtrueを返します。
>フォームを使って入力されたデータと、ログファイルの中身を1行ずつ比べて、
>同じものがあったら、そこで比較を終了させる、というようなことをやりたいのです。
であれば、
for ($i=0; $i<=$#FILELOG2; $i++)
{
if ($FILELOG2[$i] eq $log[$i])
{
print "OK";
}
else
{
print "NG";
}
}
と、素直にループを回した方が良いですよ。
回答ありがとうございます。
このままコピーして貼り付けてみたのですが、エラーが返ってきてしまいました。
なぜでしょうか・・・?
>for ($i=0; $i<=$#FILELOG2; $i++)
FILELOG2の前の#は何を意味するものなのでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA メール作成について ...
-
CGIを勉強しています。¥n(改...
-
Rstudioによるテキストマイニン...
-
perlで、[ \\r\\n , \\n ]の意...
-
UTF-8で5~6バイトになる文字コ...
-
エクセルシート名の制限を変更...
-
DataGridViewの特定列に入力さ...
-
Excel 1セル当りの文字数が2...
-
.netで、ibm漢字で書かれたテキ...
-
printfの%eで指数部分の桁数を...
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
VBAでShift-JISのURLエンコード
-
C言語でファイルをよんだあとの...
-
文字列の最後の一字を削除
-
char str[256]の256の意味は?
-
int型(2バイト)データの分割
-
JavaScriptの条件分岐について(...
-
VAX浮動小数点形式
-
'dataType' 引数を Null にする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA メール作成について ...
-
CGIを勉強しています。¥n(改...
-
Line Inputにて改行があっても...
-
Rstudioによるテキストマイニン...
-
ホームページビルダーで行間を...
-
テキストボックスに入力された...
-
連想するもの教えてください
-
perlで、[ \\r\\n , \\n ]の意...
-
number 改行が追加できない
-
CGIフォーム無改行で途中から文...
-
配列のデータから改行だけを取...
-
Excelで、HTMLタグだけを削除す...
-
社内サーバー上のHPにメールフ...
-
【HELP!!】Excelから保存したtx...
-
イベントハンドラの用法を教え...
-
KENT-WEBのClipMailでのチェッ...
-
MACの改行コード変更について教...
-
サイト内検索cgiの修正について
-
非常に見にくいです.....
-
改行コードについて
おすすめ情報